英文单词统计
我们老师给我们出了一个题目:用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; }