2013-05-25 34 views
0

我是新来的,这是我的第一个问题:为什么我的addToList方法不能正常工作?

这里是我的代码:

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

struct Person{ 
     char *vorname; 
     char *nachname; 
}; 
typedef struct Person Person; 

struct Node{ 
     Person *data; 
     struct Node *next; 
}; 
typedef struct Node Node; 
void addToList(Person *p); 
void readFile(); 
Node *start = NULL; 

void readFile(){ 
     FILE *f; 
     Person *p; 
     char input[501]; 
     char *line; 
     f = fopen("persdat.txt", "r"); 
     while(fgets(input, 500, f) != NULL){ 
       line = strtok(input, ";"); 

       strcpy(p->vorname, line); 

       line = strtok(NULL, ";"); 

       strcpy(p->nachname, line); 
       printf("%s wurde eingelesen.\n", p->vorname); 
       addToList(p); 
       line[0] = '\0'; 
     } 
} 
void addToList(Person *p){ 
     Node *newNode = malloc(sizeof(Node)); 
     newNode->data = p; 
     newNode->next = NULL; 
     if (start == NULL){ 
       start = newNode; 
       printf("%s wurde in die Liste eingefügt. (1. Stelle)\n", newNode->data->vorname); 
     }else{ 
       Node *current = start; 
       int stelle = 2; 
       while(current->next != NULL){ 
         printf("Liste wird durchlaufen... aktuelle Person: %s\n", current->data->vorname); 
         current = current->next; 
         stelle++; 
       } 
       current->next = newNode; 
       printf("%s wurde in die Liste eingefügt (%d. Stelle).\n", newNode->data->vorname, stelle); 
     } 
} 
void output(){ 
     Node *current = start; 
     printf("%s\n", current->data->vorname); 
    do{ 
       current = current->next; 
       printf("%s\n", current->data->vorname); 
       }while (current->next != NULL); 

} 

int main(int argc, char *argv[]) { 

     printf("\n"); 
     readFile(); 
     output(); 
     return EXIT_SUCCESS; 
} 

的结构Person有成员char *vornamechar *nachname。 结构Node具有成员Person *data和结构Node *next(I typedef'ed)。 start是声明的列表。

这里是我使用的文本文件:

Daniel;Smith 
Florian;Mayne 
Michael;Fabour 
Manuel;Spoley 
Andrea;Bree 
Prapot;BumBum 
Tobias;Sinkleeser 
Nikolaus;Muffed 

端子输出:

enter image description here

函数输出()打印8次Nikolaus而我期望它输出我插入了8个名字,为什么?

+1

在'readFile':'人* P;'不保证Person'vorname'和'nachname'指向区域的成员。 – BLUEPIXY

+1

嘿Don7531,欢迎来到Stackoverflow!我在你的文章中复制了链接的内容,因为stackoverflow的想法是,今天可以帮助你的问题将在明天帮助其他人,并且一旦链接失效,问题就不会被理解。 –

回答

1

readFile()您缺少将任何内存分配给struct Person以及struct Person的成员。

所以下面

void readFile(){ 
    FILE *f; 
    Person *p; 
    char input[501]; 
    char *line; 
    f = fopen("persdat.txt", "r"); 
    while(fgets(input, 500, f) != NULL){ 
      line = strtok(input, ";"); 

      strcpy(p->vorname, line); 
      ... 

可能更类似于:

void readFile(){ 
    FILE *f; 
    Person * p = calloc(1, sizeof(*p)); 
    char input[501]; 
    char *line; 
    f = fopen("persdat.txt", "r"); 
    while(fgets(input, 500, f) != NULL){ 
      line = strtok(input, ";"); 

      p->vorname = strdup(line); 
      ... 

(检查省略可读性的原因错误)