首页 > 解决方案 > 初始化结构中的字符串时出现错误

问题描述

我想用它的每个字符'\0'初始化一个字符串。(因为我稍后会使用gets(),所以第一个字符不是'\0'是可以的。)
所以我用“a”分配字符串。
这是我的代码:

typedef struct node
{
    char name[12] = "a"; 
    struct node* next;
    struct node* prev;
    struct node* lead;

} node;

但是,
如果我更改char name[12] = "a";char name[12];,就可以了,
如果我不更改,它会给出错误消息:
C:\UsersDesktop\exp1-2\main.c|7|error: expected ':', ',', ';', '}' or '__attribute__' before '=' token|C:\Users\Desktop\exp1-2\main.c|25|error: 'node' {aka 'struct node'} has no member named 'name'|

先感谢您!

以上是我的部分代码,如果你想看完整的,HRER是我的完整代码:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

typedef struct node
{
    char name[12] = "a";
    struct node* next;
    struct node* prev;
    struct node* lead;

} node;

node* init()
{
    node* huzong = (node*)malloc(sizeof(node));
    node* wangzong = (node*)malloc(sizeof(node));
    node* zhangzong = (node*)malloc(sizeof(node));
    node* lizong = (node*)malloc(sizeof(node));
    node* zhangsan = (node*)malloc(sizeof(node));
    node* lisi = (node*)malloc(sizeof(node));
    node* laoliu = (node*)malloc(sizeof(node));
    node* xiaopeng = (node*)malloc(sizeof(node));
    node* xiaochen = (node*)malloc(sizeof(node));
    strcpy(huzong->name, "胡总&quot;);
    huzong->lead = NULL;
    huzong->prev = NULL;
    huzong->next = wangzong;
    strcpy(huzong->name, "王总&quot;);
    wangzong->lead = zhangsan;
    wangzong->prev = huzong;
    wangzong->next = zhangzong;
    strcpy(huzong->name, "张总&quot;);
    zhangzong->lead = NULL;
    zhangzong->prev = wangzong;
    zhangzong->next = lizong;
    strcpy(huzong->name, "黎总&quot;);
    lizong->lead = NULL;
    lizong->prev = zhangzong;
    lizong->next = NULL;
    strcpy(huzong->name, "张三");
    zhangsan->lead = NULL;
    zhangsan->prev = NULL;
    zhangsan->next = lisi;
    strcpy(huzong->name, "李四");
    lisi->lead = xiaopeng;
    lisi->prev = zhangsan;
    lisi->next = laoliu;
    strcpy(huzong->name, "老刘");
    laoliu->lead = NULL;
    laoliu->prev = lisi;
    laoliu->next = NULL;
    strcpy(huzong->name, "小彭");
    xiaopeng->lead = NULL;
    xiaopeng->prev = NULL;
    xiaopeng->next = xiaochen;
    strcpy(huzong->name, "小陈");
    xiaochen->lead = NULL;
    xiaochen->prev = xiaopeng;
    xiaochen->next = NULL;
    return huzong;
}

void list(node* head)
{
    printf("%s", head->name);
    list(head->lead);
    list(head->next);
}

node* find(node* head, char* ex_name)
{
    int i = 1;
    i = strcmp((head->name), *ex_name);
    if(i==0)
    {
        return head;
    }
    find(head->lead, ex_name);
    find(head->next, ex_name);
    return NULL;
}

void lead(node* new_node, node* existing)
{
    existing->lead = new_node;
    new_node->lead = NULL;
    new_node->next = NULL;
    new_node->prev = NULL;
}

void follow(node* new_node, node* existing)
{
    existing->next = new_node;
    new_node->prev = NULL;
    new_node->lead = NULL;
    new_node->next = NULL;
}


int main()
{
    char input[60]="a";
    char new_name[12]="a";
    char ex_name[12]="a";
    while(1)
    {
        node* head;
        node* temp = NULL;
        head = init();
        gets(input);
        for(int i = 0; i < 50; i++)
        {
            //init初始化实现
            if(input[i]=='i'&&input[i+1]=='n'&&input[i+2]=='i'
                    &&input[i+3]=='t')
            {
                init();
                printf("链表构造完成,现有9名员工&quot;);
            }
            //list遍历功能实现
            if(input[i]=='l'&&input[i+1]=='i'&&input[i+2]=='s'
                    &&input[i+3]=='t')
            {
                list(head);
            }
            //lead功能实现
            if(input[i]=='l'&&input[i+1]=='e'&&input[i+2]=='a'
                    &&input[i+3]=='d')
            {
                for(int j=0; j<=i-2; j++)
                {
                    new_name[j] = input[j];

                }
                printf("%s", new_name);
                for(int k=i+8; k<=i+20; k++)
                {
                    ex_name[k-i-8] = input[k];
                }
                printf("%s", ex_name);
                node* new_node = (node*)malloc(sizeof(node));
                strcpy(new_node->name, new_name);
                printf("strcpy完成");
                temp = find(head, ex_name); //问题在此
                printf("find完成");
                temp->lead = new_node;
            }

        }
    }
}

标签: cstructinitializationc-strings

解决方案


您的代码不是有效的 C,因为您不能以这种方式初始化结构字段。

char name[12] = "a";

如果您name动态分配内存,我建议使用calloc将所有字节设置为零。

例如:

typedef struct node {
    char *name;
    ...
} node;

node *new_node(char *name) {
    node *n = malloc(sizeof(node));
    n->name = calloc(12);
   
    strncpy(n->name, name, 11);

    return n;
}

推荐阅读