3

字符可以包含任何数字、字母、符号,例如:;@ 等。一种方法是使用如下所示的 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 中,可打印字符的代码从 0x200x7E,因此少于 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 ;
....

数组的索引characters适合asci 表

于 2013-06-14T21:05:17.023 回答
1

如果您正在阅读 ASCII 字符:

频率[ch]++;

其中频率是大小为 128 的整数数组

于 2013-06-14T21:10:28.703 回答
1

如果您在循环内的一系列语句中使用<ctype.h>( isalpha, isdigit,等) 中的函数,您可以很容易地对它们进行分类。ispunctifwhile

PS:有关这些功能的列表,请参阅:

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

于 2013-06-14T21:11:45.093 回答