我正在编写一个程序,它从文件中获取信息并将其添加到链接列表然后将函数添加到链接列表中。我的问题是,当addContact()
程序崩溃后调用openBook()
时,但是分别调用它们可以正常工作。
我找不到问题。
openBook()
:打开文件,将数据从文件读取到链接列表
addContact()
:获取信息,将数据保存到linkedList
#include <stdio.h>
typedef struct node {
char name[50];
char email[50];
char ad[200];
char phone[11];
struct node *next;
} NODE;
NODE *head = NULL;
void openBook()
{
FILE *read = fopen("Book.txt", "r");
if (read == NULL)
{
return;
}
NODE *ite = NULL;
char name[50] = "", email[50] = "", ad[200] = "", phone[11] = "";
if (!feof(read))
{
head = (NODE*)malloc(sizeof(NODE));
fscanf(read, "%s%s%s%s", head->name, head->email, head->ad, head->phone);
}
ite = head;
while (!feof(read))
{
ite->next = (NODE*)malloc(sizeof(NODE));
ite = ite->next;
fscanf(read, "%s%s%s%s", ite->name, ite->email, ite->ad, ite->phone);
}
ite->next = NULL;
fclose(read);
}
void addContact()
{
NODE *ite = head;
if (head != NULL)
{
while (ite->next!=NULL)
ite = ite->next;
ite->next = (NODE*)malloc(sizeof(NODE*));
ite = ite->next;
}
else
{
head = (NODE*)malloc(sizeof(NODE*));
ite = head;
}
fflush(stdin);
printf("Enter name (no space): ");
scanf("%s", ite->name);
fflush(stdin);
printf("Enter email : ");
scanf("%s", ite->email);
fflush(stdin);
printf("Enter address : ");
scanf("%s", ite->ad);
fflush(stdin);
printf("Enter phone : ");
scanf("%s", ite->phone);
fflush(stdin);
ite->next = NULL;
}
void printList()
{
NODE *iterator;
int i;
iterator = head;
while (iterator != NULL)
{
printf("%s\n", iterator->name);
iterator = iterator->next;
}
}
int main()
{
openBook();
addContact();
printList();
return 0;
}
令人惊讶的是以下作品:
int main()
{
addContact();
printList();
return 0;
}
但是以下崩溃了:
int main()
{
FILE *read = fopen("Book.txt", "r");
fclose(read);
addContact();
printList();
return 0;
}
答案 0 :(得分:2)
首先,有3点值得注意:
似乎你错过了#include <stdlib.h>
。您应该收到编译器发出的malloc()
缺少声明的警告。
修复丢失的标题后,我无法重现您的问题。我创建了一个Book.txt
,程序运行得非常好。
这是我的Books.txt
进行测试。
aaa aaa aaa aaa
aaa aaa aaa aaa
aaa aaa aaa aaa
aaa aaa aaa aaa
aaa aaa aaa aaa
我的输入用于测试:
aaa aaa aaa aaa
答案 1 :(得分:1)
要添加上面给出的答案,还有一个值得注意的变化是ite->next = (NODE*)malloc(sizeof(NODE*));
应该是ite->next = malloc(sizeof(NODE));
你刚刚完成了指针NODE*
大小的malloc,但你需要malloc来表示NODE
的大小