首页 > 技术文章 > C语言字母频率统计

wuqianling 2016-04-07 12:18 原文

在进行密码破解时有时候需要得到字母出现的频率信息,下面我将简单的使用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语言中,我们要输出一个%,则要输两个% (即%%)

 

推荐阅读