1

stdin に向けられたファイルから読み取り、ファイル内で最もよく使用される 2 つの単語を見つけるプログラムを作成しようとしています。ほとんどすべてが正しく機能していましたが、while ループで奇妙なセグメンテーション エラーが発生しています

char *word=readWord();
int end=0;
while(end==0&&word!=NULL){
    printf("word readn %s\n",word);
    list=addToList(list,word);
    printf("added to list\n");
    word=readWord();
    if(word==NULL){
        end=1;
        printf("word is null\n");
    }
}
printf("done while loop");

one two three fourという単語を含むファイルを使用して実行すると、この出力は次のようになります。

単語を読んだ
リストに追加
単語が2つ読める
リストに追加
単語を読む 3
リストに追加
単語の読み方4つ>
リストに追加
単語はヌルです
セグメンテーション違反

readWord関数は他のファイルで正常に動作します。

char * readWord(){

    //temporary char array to read string
    char c,word[BUFFER_SIZE];

    if(scanf("%c",&c)==EOF){
        return NULL;
    }
    while(!((c>='a'&&c<='z')||(c>='A'&&c<='Z'))){
        if(scanf("%c",&c)==EOF)
            return NULL;
    }
    int i;
    for( i=0;(c>='a'&&c<='z')||(c>='A'&&c<='Z');i++){
        word[i]=c;
        scanf("%c",&c);
    }
    word[i+1]='\0';

    //dynamic allocation of just enough memory to store the word
    char * str= malloc(strlen(word) +1);
    strcpy(str,word);
    return str;
}
4

1 に答える 1

1

まず、 for ループの最後の i の値が単語の長さよりも 1 大きいため、これは正しくありません。

word[i+1]='\0'

そのはず:

word[i]='\0'

他のいくつかのコメント:

  • isalpha(c) を使用
  • malloc/strcpy を strdup に折りたたむ
  • write end==0&&word!=NULL as (end == 0) && (word != NULL)
于 2013-03-30T02:44:11.913 に答える