统计单词个数-C语言实现
问题描述:
统计用户输入的句子中的单词的个数,比如:
input: hello world! I am the c.
output: 6
程序思想:
-
设置一个单词计数器:
num
-
设置一个使能变量:
numEnable
,该使能变量的功能就是:
2.1 当numEnable
等于0的时候不能进行num++
操作
2.2 当numEnable
非0时,则可以进行num++
操作 -
初始时
num=0
,numEnable=1
-
遍历用户输入的字符串,遍历的过程中做如下处理:
4.1 第一次遍历到26个字母时(不区分大小写),由于numEnable=1
,因此执行num++
,因为第一次遍历到字母说明这个字母一定是单词的首字母。接着就将numEnable=0
,禁用程序计数器。4.2 直到遍历的字母不是26个字母的时候并且也不是
'
字符的时候才置numEnable=1
,因为遇到这些字符的时候,说明下一个单词要开始了。这个时候就可以继续计数了。
上代码:
#include <stdio.h>
/*****************************************************
** describe:
** 判断当前字符c是不是属于26个字母,不论大小。
** param:
** 1) c: 带判断的字符。
** return:
** int: 如果c属于26个字母,那么就返回1,否则返回0
*****************************************************/
int
isAlphabet(char c) {
return (c <= 'z' && c >= 'a') || (c <= 'Z' && c >= 'A');
}
/**********************************************************
** describe:
** 统计一个字符串中单词的个数(当然不确保单词是合法的单词)
** 比如:hhh, nihao 这也算是两个单词,虽然单词表里面没有。
** param:
** 1) str: 待统计的字符串
** return: 返回str中单词的个数
***********************************************************/
int
wordNum(const char *str) {
int numEnable = 1; // 计数器使能开关
int num = 0; // 计数器
char *cur = str; // cur指向当前正在遍历的字符
// while 循环用于遍历字符
while (*cur) {
// 如果当前是字母
if (isAlphabet(*cur)) {
// 并且计数器使能开关是打开的,才可以计数
if (numEnable) {
num++;
numEnable = 0;
}
}else {
// 仅当遍历到的字符不是26个字母并且不是'时,才开启计数器使能开关
if (!isAlphabet(*cur) && *cur != '\'')
numEnable = 1;
}
// 遍历下一个字符
cur++;
}
return num;
}
int main(void) {
const char *s = " hello, let's go!!! ";
printf("%d\n", wordNum(s));
return 0;
}