1

行内の文字の出現をカウントしようとしています。しかし、私の結果はかなり間違っています。エラーが含まれていると思われる関数を紹介します。

void readAndCount(int &numWords, int letterCount[])
{
    //set letterCount[] numwords initial values
    memset(letterCount, 0, 26);
    numWords = 1;

    char a = ' ';
    while(a != '\n')
    {
        a = getc(stdin);
        if (a == ' ' || a == ',' || a == '.' || '\n')
            ++numWords;
        else
            if(a >= 'A' && a <= 'Z')
            {
                ++letterCount[a - 'A'];
            } else if (a >= 'a' && a <= 'z') {
                ++letterCount[a - 'a'];
            }
    }

    return;
}

これは文字列の結果です:

3 words
1 a
4194305 g
1 h
3 i
4196355 k
32630 n
4197445 o
32630 r
4197379 s
2 t
4196576 w
32767 z

入力を読み取る前に、すでにfflush()ingstdinを試しました。どんなポインタでもありがたいですが、私のためにそれを書いてはいけません。

4

2 に答える 2

3

memset(letterCount, 0, 26)必要に応じて 26 intではなく、 が指す 26バイトのメモリをゼロにします。どうですか?letterCountmemset(letterCount, 0, 26*sizeof(int))

于 2013-02-13T06:14:34.923 に答える
3

これはの呼び出しを次のように置き換えますmemset()

std::fill(letterCount, letterCount + 26, 0);

または:

std::fill_n(letterCount, 26, 0);

...そして、これにより配列の初期化が修正されます。「f」の後に表示される任意の数値は、プログラムがロードされる前に RAM にあったガベージです。

また、これ:

if (a == ' ' || a == ',' || a == '.' || '\n')

次のようにする必要があります。

if (a == ' ' || a == ',' || a == '.' || a == '\n')

注: よりも優先std::cin.get(a);します (ただし、コードの実行方法に違いはなく、スタイルの問題です)。a = getc(stdin);

于 2013-02-13T06:25:10.540 に答える