0

標準入力から abcdef... の文字を数えたいとしましょう。

コード:

int string[100] = "";
int a_count = 0...

while(fgets(string, sizeof(string), stdin))
{
    for(int y = 0; y < 100; y ++)
    {
        if(string[y] == 'a') a_count++;
        if(string[y] == 'b') b_count++;
           ...and so on...
    }
    //here I reset the string to empty.
}

上記のコードは正しく動作しません (想定よりも多くカウントされます)。どこで論理的な間違いを犯したのでしょうか?

4

2 に答える 2

2

for配列全体をループするのではなく、実際の文字列の最後でループを終了する必要があります。NUL ターミネータが表示されたら停止する必要があります。

while (fgets(string, sizeof(string), stdin) != NULL)
{
    for(int y = 0; string[y] != 0; y ++)
    {
        if(string[y] == 'a') a_count++;
        if(string[y] == 'b') b_count++;
           ...and so on...
    }
}

処理後に文字列を「空」に設定する必要はありません。後でfgets()呼び出すと上書きされますが、それで問題ありません。

また、実際のカウンターを記述するためのより良い方法を考えるかもしれませんが、それはあなたが尋ねた質問ではありません.

于 2013-07-07T19:30:35.820 に答える
2

問題は、文字列内の文字をカウントするだけでなく、バ​​ッファー全体にあるガベージをカウントしていることです。あなたはそれをしたくありません。文字列の最後までループします。

ifさらに、次のように、巨大なチェーンを単純なテーブル/配列ルックアップに置き換えることができます。

int counts[1 << CHAR_BIT] = { 0 };

while (fgets(buf, sizeof(buf), stdin) != NULL) {
    const char *p = buf;
    while (*p != 0) {
        counts[*p++]++;
    }
}

次に、最後に、次のように特定の文字の数を取得できます。

printf("'a': %d occurrences\n", counts['a']);

于 2013-07-07T19:35:53.123 に答える