在纯c列表实现中需要帮助

时间:2013-05-25 18:00:37

标签: c list structure printf scanf

我正在尝试做c中的人员链表。 我的所有方法都在main()中工作,直到我将它们放入while循环(用于从用户读取命令)。一切都编译,但当我尝试运行它时,它会崩溃返回随机值。 以下是我的部分代码。

结构:

struct Person{
             const char* name;
             const char* sex;
             int age;
             struct Person* next;
} *head;

方法插入:

void insert(struct Person* h, char*n, char* s, int a){

    for(; h->next != NULL; h=h->next){}

    struct Person* p = (struct Person*) malloc(sizeof(struct Person)); 
    p->name=n;
    p->age=a;
    p->sex=s;
    p->next=NULL;
    h->next=p;
}

以及它不起作用的主要内容:

int main()
{
    struct Person Maciek={"Maciek", "Male", 20, NULL};
    head = &Maciek;
    int comand = 0;


    while(comand != 6){
        printf("Choose command:\n 1-insert person \n 2-delete by index \n 3-delete by name \n 4-display by index \n 5-print whole list \n 6-exit\n");
        scanf("%d", &comand);
        if(comand == 1){
            printf("Name, Gender, Age\n");
            char* name;
            char* sex;
            int age;            
            scanf("%s, %s, %d", &name, &sex, &age);
            printf("Name %s, Sex %s, Age %d", name, sex, age);

            insert(head, name, sex, age);
        }

        if(comand == 2){
            printf("2\n");
        }

        if(comand == 3){
            printf("3\n");
        }

        if(comand == 4){
            printf("4\n");
        }

        if(comand == 5){
            printf("5\n");
        }

    }

     return 0;
}

我对C / C ++很陌生,我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:2)

    if(comand == 1){
        printf("Name, Gender, Age\n");
        char* name;
        char* sex;
        int age;            
        scanf("%s, %s, %d", &name, &sex, &age);

这里你使用悬空指针(指向内存中的任何位置),你应该使用malloc来分配一些内存或使用char数组,正如Carl Norum指出的那样你不应该{{1}在&来电中,您需要提供一些scanf而不是char*。你可以这样做(这段代码容易受到缓冲区溢出的影响,不要在生产代码中使用它,考虑使用char** + fgets):

sscanf

在插入功能中:

char name[50];
char sex[20];
int age = 0;
scanf("%s, %s, %d", name, sex, &age);

您正在用n替换p-> name,而不是将n的内容复制到p-> name中。你想要:

 struct Person* p = (struct Person*) malloc(sizeof(struct Person)); 
 p->name=n;
 p->age=a;
 p->sex=s;

答案 1 :(得分:1)

您正在将字符串读入尚未使用已分配内存初始化的指针。