【思路解析】
计算英文句子中的单词个数通常有两种办法:一种是指定固定的分隔符,比如指定空格或者逗号或其它符号为分隔符,除此之外的所有字符都会被认定为单词的有效字符,比如指定空格为分隔符,则I love her(rose).这个句子中只有3个单词,因为her(rose)之间没有空隔隔开,会被认为是一个单词。另一种是只承认字母为单词的有效字符,除此之外的所有字符都会被认定为分隔符。比如同样是上面的句子,用第二种办法就会统计出4个单词,因为her和rose之间被一个括号隔开,会被认为是两个单词。但是不管是哪一种,其实在编程上思路都是一样的。
统计一个字符串中单词的个数,最关键的问题是如何使有效字符不重复统计。比如碰到love这个单词,检测到l是一个有效字符,单词个数增加1,但紧接着是o也是有效字符,但单词的个数就不能再增加1,否则就会造成重复统计。这可以用一个while语句来实现跳过。整体的思路是这样的:
对字符串中所有的字符一个个检测,直到字符串结束为止,如果碰到有效字符,单词个数增加1,然后用while语句跳过所有有效字符,不断重复这个过程就可以统计出单词的个数。
下面给出两种不同方法的代码,分别写成一个独立的函数,具体如下:
【程序代码】
#include //控制台操作头文件
#include //字符串操作头文件
//---------------
int WordCount(char S[],char a) //统计单词个数函数(a是分隔符)
{int i=0,n=0; //循环变量和单词个数
while(S[i]!='\0') //逐个检测串里的字符
{if(S[i]!=a&&S[i]!='\0') //如果碰到有效字符
{n++; //单词个数加1
while(S[i]!=a&&S[i]!='\0') i++;}//跳过后面一起的有效字符
else i++;} //如果没碰到有效字符检测下一个
return n;} //函数返回单词个数
/*如果指定了固定分隔符,那就是除了分隔符和结束符其它都是有效字符*/
//---------------
int WordCount1(char S[]) //统计单词个数函数(不指定分隔符)
{int i=0,n=0; //循环变量和单词个数
while(S[i]!='\0') //逐个检测串里的字符
{if((S[i]>='a'&&S[i]<='z')||(S[i]>='A'&&S[i]<='Z'))
/*只承认a-z或者A-Z之间的字符为单词的有效字符*/
{n++; //单词个数加1
while((S[i]>='a'&&S[i]<='z')||(S[i]>='A'&&S[i]<='Z'))
i++;} //跳过后面连在一起的所有有效字符
else i++;} //如果没碰到有效字符检测下一个
return n;} //函数返回单词个数
//---------------
int main() //主函数
{int n; //单词数
char chr[255]; //英文句子字符串
for(;;) //设置一个无穷循环
{printf("请输入英文句子(END结束):");//输入提示
gets(chr); //接收一个英文句子
/*因为句子中可能含有空格,所以要用gets函数不能用scanf函数*/
if(strcmp(chr,"END")==0) break; //输入END退出循环结束函数
n=WordCount(chr,' '); //获得单词数(空格分隔符)
printf("以空隔分共有%d个单词\n",n);//输出单词个数
n=WordCount1(chr); //获得单词数(不指定分隔符)
printf("以字母分共有%d个单词\n\n",n);}//输出单词个数
printf("\n"); //换行
system("PAUSE"); //暂停屏幕查看结果
return 0;} //结束程序
【运行结果】
以上代码在DEV C++上运行通过,截图如下:
