为什么我的addToList方法不正常?

时间:2013-05-25 16:53:46

标签: c string file list text-files

我是新来的,这是我的第一个问题:

这是我的代码:

#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

函数output()打印8次Nikolaus,而我希望它输出我在列表中插入的8个名字,为什么会这样?

1 个答案:

答案 0 :(得分: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);
            ...

(为了便于阅读,省略了错误检查)