3

私は、cca140000の単語を含む辞書の単語の開始文字の頻度を数えようとしています。頻度を配列カウントに保存します。文字aの場合はcount[0]、文字bの場合はカウント[1]です...ただし、配列カウントを合計すると、値は単語の総数と等しくなりません。辞書で。辞書のサイズを95137に減らすと、数値は等しくなりますが、辞書の単語数が95137を超えると、count[0]からcount[4]までの値が突然非常に大きくなることがわかりました。理由はわかりません。コードは次のとおりです。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp = fopen("testdic.txt", "r");
    int count[26];
    char buffer[30];
    for (int i = 0; i < 26; i++)
        count[i] = 0;
    int total = 0;
    while (1)
    {
        fscanf(fp, "%s", buffer);
        if (feof(fp))
            break;
        count[buffer[0]-97] ++;
        total++;
        if (count[0] > total)            // I used this to find out where the jump occurs
            break;
    }
    printf("%d ", i);
    for (int i = 0; i < 26; i++)
        printf("%d " , count[i]);

}
4

4 に答える 4

3

いくつかのデバッグチェックを忘れているため、このコードが奇妙な出力を生成する理由を知ることは困難です。

  • feof読み取り機能が失敗した場合にのみ使用する必要があります。
  • fopen戻り値 はチェックしません。
  • scanf戻り値 はチェックしません。
  • buffer[0]値 をチェックしません。
  • bufferで長さをチェックしません%s
于 2013-02-16T14:54:12.597 に答える
1

このステートメントcount[buffer[0]-97] ++;では、開始文字のASCII値を取得し、97、つまりASCII値を減算してインデックスを導出することを検討していますaAsciiwhere buffer[0]is 65のように大文字で始まる単語を処理するつもりで、式buffer[0] - 97が負の整数に評価されるかどうかはわかりません。これにより、スタックが破損する可能性があります。

于 2013-02-16T14:58:25.760 に答える
0

これが問題であるかどうかはわかりませんが、コードには単語に奇妙な文字が含まれているかどうかを気にする必要があります。だから、単にやって

count[buffer[0]-97] 

あなたが私に尋ねれば少し無謀です!buffer[0] >=97 & buffer[0]<97+26その行を実行する前にそれを確認します。そうでなければ、誰があなたが何を増やしているのかを知っています!

-あなたの95138番目の単語が面白いキャラクターで始まっているということでしょうか?

于 2013-02-16T14:50:26.007 に答える
0

変数totalは配列の直後に宣言されます。countしたがって、配列の範囲外になると、すべてが台無しになります。'a'未満の文字は特に悪いでしょうが、率直に言って、最初の大文字で十分です。使用count[(buffer[0]-'a')%26]++-モジュロ除算により、配列内にとどまるように強制されます。それはクルーゲですが、それがうまくいけば、悪いキャラクターを探し始めることができます。

于 2013-02-16T15:01:52.830 に答える