如何使用C语言计算文件中不同类型字符的数量。

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;
}

2
将数组大小设为256,然后使用简单的 count[ch]++ 即可计算文件中的任何字节。 - Marc B
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]);
} 

1
这是很危险的,因为扩展ASCII可能会导致你走出数组的边界。所以最好将其设为256而不是128。 - Hut8
如果(ch <= 0x7E),则计数[ch]++。 - ouah
假设是Ascii编码,这似乎可以工作,但在UTF8文件上计数会出错。 - Sqeaky

3
使用大小为2^8的数组,并增加相应的成员。
while ((ch = fgetc(fp)) != EOF)
{
    characters[ ch ] += 1 ;
....

数组characters的索引符合ascii表

这适用于8位Ascii,但UTF8呢?他说的是字符类型而不是字节。 - Sqeaky
当我制作一个玩具C程序来计算给定块设备上不同字节值的频率时,我使用了类似于这个方法。这主要是为了练习在C中使用苹果Objective C块,但您可能会发现https://gist.github.com/iwillspeak/4055319#file-bytes-c-L48有趣。 - Will
@Sqeaky fgets() 可以读取UTF8吗?它返回一个char升级为int。你应该使用fgetwc()来读取宽字符。 - user1944441
UTF8是可变宽度的(一个字符可以由1个字节到4个字节表示),没有直接的公式来关联多少个字符/字节和多少个字符。尽管如此,你的代码在实践中似乎能够工作。 - Sqeaky

1
如果您正在阅读ASCII字符:
频率[ ch ]++ ;
其中频率是大小为128的整数数组。

1
如果您在while循环的一系列if语句中使用(isalpha,isdigit,ispunct等)中的函数,您可以相对容易地对它们进行分类。
PS:有关这些函数的列表,请参见:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接