0

こんにちは、これは Kernighan と Ritchie のキーワード カウント プログラム (ANSI 版の第 6 章セクション 3) に関する質問です。以下のリンクにコード全体を含めました。

C ソース コードでコードを実行しようとすると、出力が得られません。そのため、問題を特定するために、コード内のさまざまなポイントでステートメントを出力しました。端末ウィンドウでのプログラムの出力 (それ自体に適用された場合) は、次のようになります。

./a.out < keywords.c
I've got past the beginning of the getword loop.
I've got past the beginning of the getword loop.
I'm past the word[0] condition.
Segmentation fault

別の検索方法 (構造体キー配列による線形検索) を使用すると、同じ出力の別の組み合わせが得られますが、今回はセグメンテーション違反はありません。printf ステートメントの出力を見ると、getword 関数に何か問題があるのではないかと考えがちです。では、これらのエラーの原因は何ですか?

以下は、二分探索関数と線形探索関数の両方を含むコード全体です。

http://pastebin.com/sPEYYge6

4

2 に答える 2

4

あなたのコードは配列を呼び出してアクセスbinsearch()しようとしますが、初期化されていないので、そこで死んでいます。midtabmid

int binsearch (char * word, struct key tab[], int n) {
    int cond;
    int low, high, mid; 

    low = 0;
    high = n -1;
        // Missing setting mid here!    

    while (low <= high) {
        if ((cond = strcmp(word,tab[mid].word)) < 0) // That's going to be bad...
于 2012-12-04T15:57:04.280 に答える
1

midセグメンテーション違反は、Mike によって、初期化されていないinを使用したことが原因であると正しく診断されましたbinsearch

あなたのコードのさらなる間違い (すべてを見つけたとは 100% 確信が持てません) は次のとおりです。

  • あなたgetch()は間違っています. return (bufp > 0) ? BUFF[bufp--] : getchar();index の char を返します.bufp> 0bufp--bufp
  • ではungetch、テストif (bufp > BUFFSIZE)は を使用する必要があります>=

キーワードが見つからない理由は (より従来のインデントとスペースを使用) です。

// You loop until you find a non-space character
while (isspace(c = getch())) {
    ;
}
// If it's not a letter, this is not a word, return here
if (!isalpha(c)) {
    *w = '\0';
    return c;
}
// If it was a letter, read the following letters and store them in the buffer
for ( ; --lim > 0; w++) {
    if (!isalnum(*w = getch())) {
        ungetch(*w);
        break;
    }
}

どの単語の最初の文字も格納しないため、 に遭遇するとvolatile、 のみolatileがバッファに格納されます。

とループ*w++ = c;の間に追加するだけで修正され、プログラムが動作します (と修正も行われる場合)。ifforgetchungetch

于 2012-12-04T17:02:39.560 に答える