我试图创建一个单独的链表,其中包含我桌面上.txt文件中的一些单词,但是当我在终端中运行它时,我遇到了分段错误。后来我在Xcode上编译代码并运行它,我收到此错误消息: 主题1:EXC_BAD_ACCESS(代码= 1,地址= 0x7fff5fc00000) 我是初学者,现在我真的需要一些帮助。谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct word{
int num;
char word[50];
struct word *next;
} Word;
#define len sizeof(Word)
Word *create();
void print(Word *head);
int main()
{
Word *head;
head = create();
print(head);
return 0;
}
Word *create()
{
Word *head, *p1, *p2;
char word[50], c;
int i = 0;
FILE *fp = fopen("/Users/apple/Desktop/words", "r");
head = p1 = p2 = NULL;
while(fp != NULL){
i = 0;
p1 = (Word *)malloc(len);
//get the English word
while((c = fgetc(fp)) != '\n'){
word[i++] = c;
}
word[i] = '\0';
strcpy(p1->word, word);
p1->next = NULL;
if(head == NULL){
head = p1;
p2 = p1;
} else {
p2->next = p1;
p2 = p1;
}
p1 = p1->next;
}
return head;
}
void print(Word *head)
{
Word *p = head;
while(p != NULL){
printf("%s\n", p->word);
p = p->next;
}
}
这是.txt文件的内容:
答案 0 :(得分:1)
在您的问题被删除之前,以下是您在代码中执行的一些不正确的操作,甚至在您尝试修复segfault之前就应该看一下。
obj.x = 10 and obj.y = john
这不是你从文件中读取的方式。文件指针obj2.x = 12 and obj2.y = matt
不是预期的更改。如果您想知道文件是否已完成,则必须检查读取函数的输出。当您尝试读取文件的最后一个字符时,while(fp != NULL){
i = 0;
p1 = (Word *)malloc(len);
和fp
会返回fscanf()
。
此外,不使用fgetc()
。 It's almost always wrong
EOF
feof()
会返回while((c = fgetc(fp)) != '\n'){
word[i++] = c;
}
,因此您应该声明fgetc()
。这就是你如何检查你是否已阅读所有内容。阅读完最后一个单词后,(int)
将返回int c
。通常为fgetc()
,但无论其价值如何,它都不适合EOF
。您需要-1
。
此外,您应该使用(char)
而不是将其读取为char-by-char(除非您的任务是这样做的)。 (int)
会一直读到该单词的结尾,并自动添加fscanf()
。
此
fscanf()
不会帮助你。那0
对你没有好处。 p1 = (Word *)malloc(len);
也不是。len
。这就是你应该做的:
(Word*)
甚至更好
p1 = malloc(sizeof (Word));
最后一个甚至不需要你知道p1 = malloc(sizeof *p1);
的类型。