C语言字母频率统计
在进行密码破解时有时候需要得到字母出现的频率信息,下面我将简单的使用C语言来读取一个文件,然后统计该文件内的字母出现的频率。
1、在D盘下新建一个文本文件(文件名为"A.txt"),然后在该文件里面保存一些字母。
2、编译并运行程序
C语言源代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 5 //统计字母的个数 6 void CountLetter(FILE *fp, int data[]) 7 { 8 char ch=fgetc(fp); // 读取文件的第一个字符 9 while(ch!=EOF) // 当读取到的不是文件结束符EOF则继续读取下一个 10 { 11 if(ch>='A' && ch<='Z') // 大写字母转小写 12 ch+=32; 13 if(ch>='a' && ch<='z') // 统计字母个数 14 data[ch-'a']++; // 当前字母个数加一 15 ch=fgetc(fp); // 读取文件的下一个字符 16 } 17 } 18 19 //打印统计字母的结果到屏幕上 20 void PrintCount(int data[]) 21 { 22 int i=26; 23 int sum = 0; // 字母总的个数 24 25 while(i--) 26 { 27 sum+=data[i]; // 计算字母的总个数 28 } 29 printf("统计字母频率结果(共%d个字母):\n",sum); 30 for(i=0; i<26; i++) 31 { 32 printf("%c=%.2f%% \t",'a'+i,data[i]*1.0/sum * 100); // 输出字母的频率 33 if( (i+1)%4 == 0 ) // 每输出4个后换一行 34 printf("\n"); // 换行 35 } 36 } 37 38 39 int main() 40 { 41 FILE *fp; // 文件指针 42 int data[26] = {0}; // 字母统计数组 43 44 fp=fopen("D:\\A.txt","r"); // 以只读的方式打开文件,如果D盘下没有文件"A.txt"则会打开失败 45 if(fp==NULL) // 判断文件是否打开成功 46 { 47 printf("无法打开文件!\n"); 48 exit(1); // 退出程序 需要头文件<stdlib.h> 49 } 50 51 CountLetter(fp, data); //统计字母的个数 52 PrintCount(data); // 打印统计结果 53 54 fclose(fp); // 关闭数据文件 55 return 0; 56 }
注意:在C语言中,我们要输出一个%,则要输两个% (即%%)