统计一行文本的单词个数
习题6-8 统计一行文本的单词个数 (15 分)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let’s go to room 209.
输出样例:
5
分析与代码
这个题需要考虑多种情况
- 有标点,词间空1格
- 开头、中间有多个空格,长、短字符串
- 空格结尾
- 1个最短单词,前有空格
- 全空格
首先来看一个部分正确的代码。
我考虑找空格,如果说遇到空格,意味着现在程序处于读空格这个过程中,如果说这个过程是新发生的,那么处于空格过程的次数加1。
如果说遇到单词,而且之前处于读空格状态,那么把读空格的状态修改掉,以表示现在处于读单词状态。
由于两个单词中间加了一个空格,所以最后的单词数就是空格数加一。
这个解法对于首尾没有空格而言是可行的,但是首尾出现空格的情况,最终结果就多加了1。
/*此代码不能满足所有样例*/
#include<stdio.h>
int main(){char a;int sum=0;int flag=0;//0表示没有遇到空格 while(scanf("%c",&a)&&a!='\n'){if(a==' '&&flag==0){sum++;flag=1; }else if(a!=' '&&flag==1){flag=0;}}printf("%d",sum+1);
}
下面是一个完全正确的代码,思路是直接找单词数。
如果说当前不遇到空格,那么意味着现在程序处于读单词的过程,如果说这个过程是头一次发生,那么处于读单词过程的次数加1。
如果说遇到空格,意味着现在程序处于读空格这个过程中,如果说上一个过程是读单词,那么flag=0表示目前不处于读单词状态。
#include<stdio.h>int main(void)
{int flag = 0; //flag=0表示目前没有接触到单词字符 char ch;int word_count = 0;while(scanf("%c",&ch)&&ch!='\n') {if(ch!=' '&&flag==0) {word_count++; flag = 1;//接触到单词字符后,停止记录单词数 }if(ch==' '&&flag==1){flag = 0;}}printf("%d", word_count);return 0;
}
思路不同,导致flag的含义不同,可见思路决定了最终的结果。
下面这个是更简单的一种思路,所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔。
就两种情况,单词后面跟了一个空格,或者单词后面没有字符了。
根据这两种情况判断单词个数。
#include <stdio.h>int main() {char a[1000];//初始化数组gets(a);//赋值int n,num=0,i;for (i=0;a[i] != '\0';i++);//获取数组个数n=i;for (i=0;i<n;i++){if (a[i] != ' ' && a[i+1] == ' ') num++;if (a[i] != ' ' && a[i+1] == '\0') num++;} printf("%d\n",num);return 0;
}