如何为包含字母的文本文件创建C语言数组形式的字符频率统计表
C语言文本字符频率统计实现方案
首先解答你的核心疑问:
你要的256长度unsigned int数组天然就可以同时关联字符和频率:数组下标直接对应字符的ASCII整数值,数组元素的值就是该字符的出现次数。比如字符'A'的ASCII码是65,那么freq[65]里存的就是'A'的出现次数,不需要额外存储字符本身,下标和字符是一一对应的。
实现步骤
- 第一步:定义长度为256的
unsigned int数组,初始值全部置0,保证初始计数为0 - 第二步:以只读模式打开目标文本文件,增加打开失败的异常处理
- 第三步:循环读取文件中的每一个字符,每读到一个字符,就将对应下标的数组元素自增1,直到读到文件结束符EOF
- 第四步:统计完成后可按需遍历数组,输出非0计数的字符及其频率
完整可运行代码
#include <stdio.h> #include <stdlib.h> int main() { // 定义频率统计数组,长度256对应所有ASCII字符,初始化为0 unsigned int freq[256] = {0}; FILE *fp = fopen("text.txt", "r"); if (fp == NULL) { perror("文件打开失败"); return EXIT_FAILURE; } int ch; // 用int存fgetc返回值,兼容EOF判断 while ((ch = fgetc(fp)) != EOF) { freq[ch]++; // 直接用读到的字符值作为下标计数 } fclose(fp); // 输出统计结果,只打印出现过的字符 printf("字符 | ASCII码 | 出现次数\n"); printf("------------------------\n"); for (int i = 0; i < 256; i++) { if (freq[i] > 0) { // 不可见字符(比如换行)单独处理显示 if (i == '\n') { printf("\\n | %-7d | %u\n", i, freq[i]); } else if (i == '\t') { printf("\\t | %-7d | %u\n", i, freq[i]); } else { printf("%c | %-7d | %u\n", i, i, freq[i]); } } } return EXIT_SUCCESS; }
示例运行结果
用你给出的text.txt内容AAAABBBB\nCCCCEE测试,输出如下:
字符 | ASCII码 | 出现次数
A | 65 | 4
B | 66 | 4
\n | 10 | 1
C | 67 | 4
E | 69 | 2
内容的提问来源于stack exchange,提问作者quiccode
相关产品推荐
相关产品推荐

