2017-02-18 10 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

ようこそ。私は非常にデバッガを使用する方法を学ぶいくつかの時間を過ごすことをお勧めします。それがあなたの問題を理解するための第一歩です。 – OldProgrammer

+3

[小さなプログラム(Eric Lippert)のデバッグ方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)をお読みください。 SOはデバッグサービスではありません。問題を突き止めたら、*なぜ*問題なのかを理解していなければ、どうしても質問をしてください。 – StoryTeller

+1

デバッガを使用して動作中のクラッシュをキャッチすることから、コード内のどこに* *があるかを特定します。次に、デバッガを使っている間に、関係するすべての変数の値を調べて、それらが正常に見えることを確認します。少なくとも、私たちにその情報(場所と価値)を教えてください。 –

答えて

1

あなたの質問が削除される前に、ここにあなたのコードでやっているいくつか間違ったものがあり、あなたが取る必要がありますsegfaultを修正しようとする前にそれを見てください。

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)が必要です。

また、char-by-charを読むのではなく、fscanf()を使用する必要があります(あなたの割り当てでない限り)。 fscanf()は単語の最後まで読み取り、0を自動的に追加します。

この

p1 = (Word *)malloc(len); 

はあなたを助けにはなりません。そのlenはあなたに何の恩恵も与えていません。どちらも(Word*)です。これは、あなたが何をすべきかです:

p1 = malloc(sizeof (Word)); 

あるいは

p1 = malloc(sizeof *p1); 

良く最後の1でも p1の種類を知っているあなたを必要としません。

+0

アドバイスをいただきありがとうございます!それらを念頭に置いてコードを書き直します。 –

関連する問題