我是新来的,这是我的第一个问题:
这是我的代码:
#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 *vorname
和char *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
终端输出:
函数output()打印8次Nikolaus
,而我希望它输出我在列表中插入的8个名字,为什么会这样?
答案 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);
...
(为了便于阅读,省略了错误检查)