统计一篇文本中空格、单词、句子、非字母字符个数
2017-05-04 12:40
288 查看
思路:每次从文件中读取一行放到缓存数组中,遍历该数组,单词个数等于空格个数加1,句子个数等于?、!、。个数之和, 用isalpha()统计非字母字符个数,, 要去掉空格, 头文件<time.h>可统计时间, 处理"."时需要去掉小数点
参考资料是刘汝佳的《算法竞赛入门经典》
下面是源代码,不足之处请多指教
参考资料是刘汝佳的《算法竞赛入门经典》
下面是源代码,不足之处请多指教
#include<stdio.h> #include<string.h> #include<stdbool.h> #include<ctype.h> // 用该头文件的isalpha函数判断非字母字符 #include<time.h> // 统计时间 char buffchar[1010]; // 每行最多统计不超过1010个字符 int countsum[4] = {0, 0 ,0, 0}; // 用来统计 int *dealcount(char *filename, int *countsum); // 声明 int main(void){ char filename[30]; // 读入文件名 printf("输入文件名:"); scanf("%s" ,filename); // 读文件 dealcount(filename, countsum); // 调用统计寒暑 printf("统计结果(个数):\n空格:%d\n单词:%d\n句子:%d\n非字母字符个数:%d", countsum[0], countsum[1], countsum[2] , countsum[3] ); printf("\n运行时间%0.2f:", (double)(clock()/CLOCKS_PER_SEC)); // 这个方法将键盘输入时间也计算在内,不太好 return 0; } /***下面是统计函数 **/ int *dealcount(char *filename, int *countsum){ FILE *fp; // 指向文件的指针 int len; // 记录长度 bool islastBlanck = true; // 上个字符是否是空格 char c; // 当前字符 char endflag[] = "?!"; // 一句话结束表志 if((fp = fopen(filename ,"r")) == NULL){ perror(filename); // perror()打印上一个函数错误信息 return NULL; } while(fgets(buffchar, 1010, fp) != NULL){ // 这里使用fgets()而不是getc()是因为在不同的平台下对文本换行的处理不同,win上是\n和\r,而lunix上屏蔽 // \r,s所以用getc反而麻烦. len = strlen(buffchar); for(int i = 0; i < len; i++){ c = buffchar[i]; if(!isalpha(c)){ // 不是字符 if(c != ' '&&c != '\t' && c != '\n' && c != '\r') // 非字母字符个数将空格、换行去掉 countsum[3]++; if((strchr(endflag, c) != NULL) || ( (buffchar[i+1] == " " || buffchar[i+1]== "\t" || buffchar[i+1] == "\n"
|| buffchar[i+1] == "\r")&& c == '.')) // 一句话结束, strchr()查找某个字符是否在数组中, countsum[2]++; //在的话返回第一次出现位置指针 } if(c == ' ' || c == '\t'){ countsum[0]++; // 统计空格个数 if(!islastBlanck){ // 空格前一个字符不是空格的话就是空格前有个单词 countsum[1]++; islastBlanck = true; } }else if(c != '\n' && c != '\r'){ // 忽略换行符 islastBlanck = false; } } if(!islastBlanck){ // 如果最后一个字符不是空格 countsum[1]++; } islastBlanck = true; } return countsum; }
相关文章推荐
- 1~ 从键盘输入一行字符,统计其中的单词个数。此处认为一个单词是介于空格之间的字符序列。
- 10月7日 c语言 输入一串字符,单词之间用空格隔开,统计其中有多少个单词
- c语言:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开
- 输入一行字符 统计其有多少个单词 (空格分割字符)
- c++实现文本中英文单词和汉字字符的统计
- 统计字符串中单词的个数.单词的分隔是非字母字符
- 输入一行字符,统计其中的单词的个数.各单词之间用空格分隔
- 有一行字符,统计其中的单词个数(单词之间以空格分隔),并将每一个单词的第一个字母改为大写。
- Java 文件统计:编写程序,统计英文文本文件中的字符数目和单词数目。程序运行时,输入要统计的文件的名称,程序处理后输出字符数目和单词数目
- c语言:输入一行字符,统计其中的单词个数,单词之间用空格分开
- 输入一行字符,统计其中有多少个单词,单词之间用空格分隔
- 输入一行字符,统计其中有多少个单词,单词之间用空格隔开
- 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
- 7.10 有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
- 给定一个字符串,你需要颠倒一个句子中每个单词中的字符顺序,同时保留空格和初始单词顺序。
- 编译器DIY之———统计英文文本中的单词数,字符数和行数
- 有一篇文章,共有3行文字,每行有10个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格及其它字符的个数
- 编写函数void count(char a[],char w[][10],int n,int b[])。功能是:统计w指向的数组中的n个单词在a指向的字符串中各自出现的次数(将非字母字符看作单词分
- 输入一行字符,统计其中有多少个单词,单词之间用空格分开
- 有一篇文章,共三行文字,每行有最多80个字符。要求分别统计出其中英文大写字母,小写字母,数字,空格及其他字符