您的位置:首页 > 编程语言 > C语言/C++

统计一篇文本中空格、单词、句子、非字母字符个数

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 句子 字符 统计
相关文章推荐