3

文字には、数字、アルファベット、:;@ などの記号を含めることができます。1 つの方法は、以下に示すように switch case ステートメントを使用することです。しかし、それは単純で長いプロセスになるでしょう。可能な他の方法の短い方法はありますか?

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

int main(void) {
FILE *fp;
fp = fopen("input.txt","r");
int ch,count[36]= {0};
if (fp == NULL)
{
fprintf(stderr,
        "Failed to open input.txt: %s\n",
         strerror(errno));
}
else
{
while ((ch = fgetc(fp)) != EOF)
{
    switch (ch)
    {
    case 'a':
        count[0]++;
        break;
    case 'b':
        count[1]++;
        break;
    default:
        count[2]++;
    }
}

fclose(fp);
}
    printf("count a is %d", count[0]);
    printf("count b is %d", count[1]);
    printf("count c is %d", count[2]);
    return 0;
}
4

4 に答える 4

5

ASCII では、印刷可能な文字には から 0x20までのコードが0x7Eあるため、128 文字未満です。したがって、ASCII の場合は 128 文字の配列を使用します。

int count[128] = {0};

次のようにカウントを更新します。

count[ch]++;

次のようなもので印刷可能な文字を印刷します。

for (i = 0x20; i <= 0x7E; i++)
{
    printf("count %c is %d", i, count[i]);
} 
于 2013-06-14T21:08:07.707 に答える
3

サイズ 2^8 の配列を使用し、対応するメンバーを増やします。

while ((ch = fgetc(fp)) != EOF)
{
    characters[ ch ] += 1 ;
....

配列のインデックスはasci テーブルcharactersに適合します。

于 2013-06-14T21:05:17.023 に答える
1

ASCII 文字を読んでいる場合:

周波数[ch]++;

ここで、frequency はサイズ 128 の整数配列です

于 2013-06-14T21:10:28.703 に答える
1

ループ内の一連のステートメントで<ctype.h>( isalphaisdigit、など)の関数を使用すると、それらをかなり簡単に分類できます。ispunctifwhile

PS: これらの関数のリストについては、以下を参照してください。

http://www.cplusplus.com/reference/cctype/

于 2013-06-14T21:11:45.093 に答える