2017-02-18 86 views
-2

我试图创建一个单一的链接列表,其中包含我的桌面上的.txt文件的一些单词,但是当我在终端运行它,我得到了分段错误。后来我编译Xcode的代码并运行它,我得到了这个错误信息: 线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x7fff5fc00000) 我是一个初学者,现在我真的需要一些帮助。谢谢!在我的C程序需要一些帮助,我有一个分段错误,但我不知道为什么

#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文件的内容:

enter image description here

+1

欢迎来到SO。我强烈建议花一些时间学习如何使用调试器。这是弄清楚你的问题的第一步。 – OldProgrammer

+3

请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 SO不是调试服务。一旦你找出问题所在,如果你不知道为什么*这是一个问题,那么一定要问一个问题。 – StoryTeller

+1

通过使用调试器来捕捉动作中的崩溃,因此您可以在您的代码中找到* where *发生的位置。然后当你知道,并且仍然在调试器中时,检查所有涉及变量的值,以确保它们看起来没问题。至少请给我们*这些信息(位置和价值)。 –

回答

1

你的问题被删除之前,这里有一些你在你的代码做不正确的事,你们应该采取甚至在尝试修复您的段错误之前查看它。

while(fp != NULL){ 
    i = 0; 
    p1 = (Word *)malloc(len); 

这不是你如何从文件中读取。文件指针fp预计不会更改。如果你想知道你的文件是否已经完成,你必须检查读取函数的输出。 fscanf()fgetc()返回EOF当您尝试读取文件的最后一个字符。

另外,不要使用feof()It's almost always wrong

while((c = fgetc(fp)) != '\n'){ 
    word[i++] = c; 
} 

fgetc()返回一个(int),所以你应该申报int c。这就是你如何检查你是否读过所有东西。当你读完最后一句话后,fgetc()将返回EOF。它通常是-1,但不管它的价值如何,它都不适合(char)。您需要(int)

此外,您应该使用fscanf()而不是逐字符读取它(除非它是您的任务)。 fscanf()会一直读到该单词的结尾并自动添加0

p1 = (Word *)malloc(len); 

不会帮你。那len不会对你有任何好处。 (Word*)也不是。这是你应该怎么做:

p1 = malloc(sizeof (Word)); 

甚至更​​好

p1 = malloc(sizeof *p1); 

最后一个甚至不需要你知道的p1类型。

+0

非常感谢您的建议!我会记住这些,并重写我的代码。 –

相关问题