英文单词统计
我们老师给我们出了一个题目:用C语言编写一个程序,可以打开一个英文文本如txt文本,统计其中各个字母的个数,我实在想不出来,请各位高手指教,非常感谢!
例如文章里有I am a boy.I love china.I love book and basketball.
统计出:
I:3
love:2
a:1
.
.
.
.
请帮下忙
程序代码:/*********************************************************************************************************
思路:先把文件里面的所有内容读到buf中,因为在字符串中处理字符比较方便。
再分析buf,得到单词个数。分配对应个数的单词空间,即二维数组存放这些单词,这相当
于把buf划分为以单词为基本单位了。
最后通过二维数组来判断各个单词个数了。
*********************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char **word, ch, *buf;
int length, i, j, k, sign_w, same, number_w = 0, num = 0;
if((fp = fopen("text.txt", "rb")) == NULL)
{
printf("cannot open text.txt!\n");
return 0;
}
/*把文件指针移到文件尾*/
if(!fseek(fp, 0, SEEK_END))
{
length = ftell(fp); // 获取文件长度
}
else
{
fclose(fp);
printf("1: fseek error!\n");
return 0;
}
/*把文件指针移到文件头*/
if(fseek(fp, 0, SEEK_SET))
{
fclose(fp);
printf("2: fseek error!\n");
return 0;
}
if(buf = (char *)malloc(sizeof(char) * (length + 1))) // +1是为了把buf分配的足够大
{
memset(buf, 0, (length + 1)); // 把buf清0
fread(buf, 1, length, fp); // 把文件内容全部读到buf中
fclose(fp);
}
else
{
fclose(fp);
fprintf(stderr, "malloc error!\n");
return 0;
}
/*统计总的单词个数*/
sign_w = 1;
for(i = 0; i < length; i++)
{
ch = *(buf + i);
if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
{
sign_w = 0;
}
else if(!sign_w)
{
number_w++;
sign_w = 1;
}
}
/*分配number_w(总单词个数)个长度为20(一般单词长度小于20)的字符数组*/
word = (char **)malloc(number_w * sizeof(char *));
for(i = 0; i < number_w; i++)
{
word[i] = (char *)malloc(20 * sizeof(char));
memset(word[i], 0, 20);
}
/*获取所有单词*/
sign_w = 1;
k = 0;
j = 0;
for(i = 0; i < length; i++)
{
ch = *(buf + i);
if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
{
word[k][j++] = ch;
sign_w = 0;
}
else if(!sign_w)
{
k++;
j = 0;
sign_w = 1;
}
}
free(buf);
/*计算每个单词的个数*/
for(i = 0; i < number_w; i++)
{
/*判断此单词是否和前面统计过的单词相同*/
same = 0;
for(j = 0; j < i; j++)
{
if(!strcmp(word[i], word[j]))
{
same = 1;
break;
}
}
/*统计从没有统计过的单词个数*/
if(!same)
{
num = 0;
for(j = i; j < number_w; j++)
{
if(!strcmp(word[i], word[j]))
{
num++;
}
}
printf("%s : %d\n", word[i], num);
}
}
free(word);
return 1;
}