0

I want to initialize a string with every char of it '\0'.(Because I will use gets() later, the first char being not '\0' is OK.)
So I use assign the string with "a".
Here is my code:

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

} node;

However,
if I change char name[12] = "a"; tochar name[12]; , it will be OK,
if I don't change, it will give an error message:
C:\UsersDesktop\exp1-2\main.c|7|error: expected ':', ',', ';', '}' or '__attribute__' before '=' token| and C:\Users\Desktop\exp1-2\main.c|25|error: 'node' {aka 'struct node'} has no member named 'name'|

Thank you in advance!

Above shows my part of code, if you wanna see a complete one, HRER are my complete code:

#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, "胡总");
    huzong->lead = NULL;
    huzong->prev = NULL;
    huzong->next = wangzong;
    strcpy(huzong->name, "王总");
    wangzong->lead = zhangsan;
    wangzong->prev = huzong;
    wangzong->next = zhangzong;
    strcpy(huzong->name, "张总");
    zhangzong->lead = NULL;
    zhangzong->prev = wangzong;
    zhangzong->next = lizong;
    strcpy(huzong->name, "黎总");
    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名员工");
            }
            //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;
            }

        }
    }
}
Mike
  • 5
  • 3
  • 1
    You can't assign a value to a struct field in the structure definition like that in C. – Shawn Oct 09 '21 at 07:15
  • How can I change that? Thank you! – Mike Oct 09 '21 at 07:16
  • 1
    Does this help? https://stackoverflow.com/questions/330793/how-to-initialize-a-struct-in-accordance-with-c-programming-language-standards – C.D. Oct 09 '21 at 07:17
  • 1
    Be careful. initializing fields like this isn't valid C, but it is valid in C++. If you use a C++ compiler, it might compile and you might not realize your code isn't valid. – Chris Oct 09 '21 at 07:20

1 Answers1

0

Your code is not valid C, as you cannot initialize struct fields in this manner.

char name[12] = "a";

Were you allocating the memory for name dynamically, I'd suggest using calloc which sets all bytes to zero.

For instance:

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;
}
Chris
  • 26,361
  • 5
  • 21
  • 42
  • I change it like this: ```node* huzong = (node*)malloc(sizeof(node)); huzong->name = calloc(12);``` I get this message : ```C:\Users\Desktop\exp1-2\main.c|18|error: too few arguments to function 'calloc'|``` – Mike Oct 09 '21 at 07:53