输入一行字符,统计其中的单词的个数,单词之间以单个空格作为分隔符

main()

{
char str[81];
int i,num=0,word=0;
char c;
gets(str);
for(i=0;(c=str[i])!='\0';i++)
if(c==' ') word=0;
else if(word==0)
{
word=1;
num++;
}
printf("There are %d words in the line.\n",num);
}
这道题始终无法理解if,elseif是怎么通过表达式进行下去的 求个例子让我理解
str=“a b c d e f”;
我先说下我的理解你们指出下错误。
if(c==" ")这个时候判断是否为空格,如果是 这表示a已经统计过了 此时已经不该让word=1么?
如果不是,执行下面的elseif 判断是否等于0.此时循环已经到了a所以word不该等于0,word=1才对 我是哪里想错了。
还是说题目中的word=0只是一个标志还是什么东西 最好能举例让我好明白。
if(c==' ') word=0;//当前字符是空格,所以不是单词,word=0
else if(word==0)//当前字符是字母(c!='嫌让 '),所以不是空格,并且前面的不是单词(word==0)
{
word=1; //不是空格,并且前面的不是单词,所以是个新单词。word=1;
num++; //遇到单词的第一个字母,单词数加一。
//word一直是1只有重新遇到空格,word才为0,
}
//因为这种情况什么也不做,所以代码没有写,因此就有些不好理解了。
//else 否则,(当前字符是字母(c!=' '),并且word==1; 即还在同一个单词中)
// donothing() ;什么也不做!
//
//
PS:
这个程序,可以处理N个空格,和前后都有空格的情况。
的确是个小巧精悍的程序!
举例 str[]=“ It is a good idea! ";
i=0~3 c==' ';执行if(c==' ') word=0; 所以 一直有word=0 ;并且 word==0;
i=4 遇到 ‘I’ c=='I' ;word==0 执行else if (word==0);//word =1; num++;
word由0变1;一个单词了,计数加一。
并且以后就在同一个单词中了,始终有word==1 ,除非遇到空格。
i=5 遇到 ‘t’; c=='t' ;word==1 不执行 if 和 else if 的任何一个;滑过‘t’
i=6 再次遇到空格,执行if(c==' ') word=0;遇到第一个空格,word==1变成word==0
i=7~9 以后重复i=0~4 一直有word=0的赋值 ;并且始终有 word==0;
i=10 重复 i=4 的过程 这次遇到 ‘i’ c=='i' ;word==0 执行else if (word==0);//word =1; num++;
word由0变1;一个单词了芹册局,计数加一。
i=11 重复 i=5 遇到 ‘s’; c=='s' ;word==1 不执行 if 和 else if 的任何一个;滑过‘s’
以后大致相同最后遇到\0'扫描结束。
记录5个单词
从空格变单词5次;从单词变空格5次;
有几个空格word=0;就执行几次。
有几个单词word =1; num++; 就执行几次,并且,只有遇到,第一个字母时,才执行。
所有,非第一个字母的字母,和其他,非空格,并且非结束符的字符姿橘,被滑过。
word 和 num 都初始化为0 所以无论,第一个是空格会被赋值为0,还是字母(word 已经是0了)都没有问题。
同样,结尾有无空格,和空格有N个,一样没有问题。因为:
1)结尾的空格,不会遇到非空格,就结束循环了。
2)无论多少空格,都会有word=0的赋值操作,不遇到非空格,word就一直为0;

结论:这段代码看了,确实给人以一种,惊艳的感觉!!!!!!!!!!!!
word在这里没有统计数量的功能,word只是告诉你什么时候单词数量应该加1,什么时候单词数量不变。那究竟是什么时候单词数量num该加 1 呢?

在str="a1 b2 c3 d4 e5" 里面,除了第一个字符串a1外,其余的每个字符串前面都有一个空格,如果我们把str换为str=" a1 b2 c3 d4 e5",用word=0表示遇见一个空格,那么每遇见word=0时单词数量都加 1 ,这样就可以正确统计单词数量了。御氏

程序里面word初始值就是0,那么就可以把str理解成str=" a1 b2 c3 d4 e5",即在最开始添加一个空格,单词数量是不变的。word等于0时num加1——表示后面有一个新单词。num加1,然携毁后word再改为1(只要不是0),直到遇到空格时word再改为0。

可是要是有连续的空格出现呢?其实这个也没有问题,str="a b",a与镇隐散b之间有两个空格,读第一个空格的时候word,被赋值为0,读第二个空格的时候word同样被赋值为0,等价于str="a b",即字符串中间的空格再多都等同于一个空格。同样,在str末尾出现空格等同于没有空格,因为word一直被赋值为0,所有的 else if(word==1) 都不可能执行,num也不可能加 1 了。开头类似。

word既然只是一个表示“下面是否有新单词出现”的信号,那么就可以把word的赋值改一下,比如把所有word=0改为word=100,或者把所有word=1改为word=25,注意是“所有”,包括初始化的赋值。随便如何改变,都不影响统计结果。甚至可以不用word,比如申明一个char c=‘a’,把所有word=0换为c=‘a’,把所有word=1换为c=‘b’(只要不是a,其余任何字符都可以),最终结果一样。
你这么理解吧。

你把word这个变量名改成is_word,然后当侍基is_word为0的时候表示当前不是单词,为1的时候表示当前是单词。
if(c==' ') //行谈瞎当前字符是空格
is_word=0; //当前不是单词,is_word置0
else //否则当前字符不是空格
if(is_word==0) //如果is_word的原值是0,表示前一字符还是空格
{
is_word=1; //因为当前字符不是空格,所以要把is_word改成1
num++; //并且当前字符从空格变为非空格,表示进入一个新单词,单词数统计加档空1
}
#include
<stdio.h>
#define
max_char
200
int
read_line(char
str[],int
n);
int
count_spaces(const
char
s[]);
void
f1(char
*s);
int
main()
{
char
str[max_char+1];
printf("请输罩裤困入字符串物念:");
read_line(str,max_char);
f1(str);
printf("%d",count_spaces(str)
+1);
//单词的数量等于有效空格的数量加1
system("pause");
}
//读入字符串
int
read_line(char
str[],int
n)
{
int
ch,i=0;
while((ch=getchar())!='\n')
if(i<n)
str[i++]=ch;
str[i]='\0';
return
i;
}
//计算字符串中空格的数量,只有空格后面跟字母的纯滑空格才计数。
int
count_spaces(const
char
s[])
{
int
count=0,i;
for(i=0;s[i]!='\0';i++)
if(s[i]=='
'
&&
((s[i+1]>='a'
&&
s[i+1]
<'z')
||
(s[i+1]>='a'
&&
s[i+1]
<'z'))
)
count++;
return
count;
}
//去除字符串的前导空格。
void
f1(char
*s)
{
char
*t;
t=s;
while(*s=='
')
s++;
while(*t++=*s++);
}
LZ的代码统计的不哗陆亏是单词,应该是统计的字母。悉前
如果str="this is word!" 怕是就统计的不乱神是单词了