2013-05-25 83 views
0

我想要做c中的人鏈接列表。 我的所有方法都在main()中工作,直到我將它們放入while循環(用於從用戶讀取命令)。一切都編譯完成,但是當我嘗試運行它時,它會崩潰返回隨機值。 以下是我的部分代碼。在純c清單實施中需要幫助

結構:

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

方法Insert:

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++,和我真的很感激任何幫助。

+0

你試過調試器嗎?你不需要在C程序中輸入'malloc'的返回值。 –

+0

打開警告設置 - 至少應該獲得格式不匹配警告。 –

回答

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

這裏使用的是懸擺指針(其在存儲器中的任何指點),你應該使用malloc分配一些內存或使用字符數組,並作爲卡爾Norum時指出,你不應該有&scanf因爲你需要提供一些char*而不是char**。你可以做這樣的(這個代碼很容易受到緩衝區溢出,不要使用在生產代碼,可以考慮使用fgets + sscanf):

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

在你插入功能:

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

你用n替換p-> name,而不是將n的內容複製到p-> name中。你想要:

struct Person *p = malloc(sizeof(struct Person)); 
p->name = malloc(strlen(n)+1); 
if(p->name == NULL) { 
    //error handling... 
} 
strcpy(p->name, n); 
p->sex = malloc(strlen(s)+1); 
if(p->sex == NULL) { 
    //error handling... 
} 
strcpy(p->sex, s); 
p->age = a; 
+1

'name'和'age'在'scanf'調用中不應該有'&'。 –

+0

char * name =(char *)malloc(20 * sizeof(char)); char * sex =(char *)malloc(6 * sizeof(char));我已經糾正了這一點,它仍然不起作用,你能再次幫助我嗎? – Offa

+0

刪除您的scanf呼叫中的&運算符。而且你不需要在C中返回malloc的返回值,只需要在C++中使用。 'char * name = malloc(20 * sizeof(char));' –

1

你正在閱讀字符串指針,尚未使用分配的內存進行初始化。