C语言统计单词个数问题!

#include "stdio.h"
main()
{
char s[81],c;
int i,num=0,word=0;
printf("请输入一行英文:\n");
gets(s);
for(i=0;(c=s[i])!='\0';i++)
if(c==' ') word=0;
else if(word==0)
{
word=1;
num++;
}
printf("本行中共有%d个单词.\n",num);
}
请高手给上通俗易懂的注释,尤其是for以后,怎么也看不懂!! 谢谢
单词之间用空格分开!

根据英语的书写习惯,在每个单词前后都会有空格分隔。 所以可以依据空格来划分单词。 

不过,由于空格可能存在连续多个,所以仅统计空格数是不可以的,需要更复杂一些的算法。 

一、算法设计:

核心思想是通过一个flag,来确定单词的起始, 每出现一个单词的起始,则表示存在一个单词。 这样统计出现的单词起始个数,即可获得单词总数。

1、flag初始为1;

2、遍历字符串。 

3、对于每个字符,如果出现非空格字符,且flag为1,则为单词起始,累加计数器。同时赋值flag为0。

4、在flag为0情况下,如果出现空格,表示上一个单词已经结束,设置flag为1。

5、 遍历结束后输出结果。


二、参考代码:

#include <stdio.h>
int func(char *s)//计算单词数函数
{
    int i,n=0,flag=1;
    for(i = 0; s[i]; i ++)//遍历
    {
        if(flag == 1)
        {
            if(s[i] != ' ')//单词起始
            {
                n++;
                flag = 0;
            }
        }
        else if(s[i] == ' ')//上一个单词结束。
            flag = 1;
    }
    return n;//返回结果。
}
int main()
{
    char s[200];
    
    gets(s);//输入字符串。
    
    printf("%d\n", func(s));//调用函数,计算并输出结果。
    return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-30
#include "stdio.h"
main()
{
char s[81],c;
int i,num=0,word=0;
printf("请输入一行英文:\n");
gets(s);
for(i=0;(c=s[i])!='\0';i++)//判断句子是否到未
if(c==' ') word=0;//是空格就为0
else if(word==0)//不是空格就判断之前有没有空格
{
word=1;//复位用来判断空格是否存在的开关
num++;//如果之前有空格,单词数加1
}
printf("本行中共有%d个单词.\n",num);
}

其原理很简单:

对每个字符进行判断,如果是空格就把变量word标记为0,如果不是空格就判断word是不是0(即判断之前有没有空格),如果存在空格单词量加1,然后复位word变量为0。就这样重复,知道句子结束追问

理解了一些了 !! 谢谢!谢谢,已经很易懂了,
但是还想请教一下 你说的复位那 不太理解 如果是单词了 num就+1了 为什么要让word=1呀

追答

其实word不一定非要等于1的,只要等于非0就可以了,如果不重置word,你下下一次输入字符时,num一样+1.。举个例子:
我输入的是:It is happy that help somebody !
首先经过程序的计算,这里会有7个单词,“!”也算进去了。
判断开始,此时word=0;发现第一个不是空格,word=1,num加1;第二个字符不是空格,但此时word=1(这里就是为什么要重置word的原因,不然I和t会被视为2个单词)而不是0所以,所以num不增加。然后又发现第三个字符时空格,此时把word置为0,然后发现第四个字符不是空格,此时word在前一次遇到空格时置为0,所以满足条件word=0且c为非空格,所以此时word又被赋值1,num又加1,此时num为2(检查到的单词为it和is)。。。然后继续这样循环。。直到句子结束。

本回答被提问者采纳
第2个回答  2012-03-09
#include "stdio.h"
main()
{
char s[81],c;
int i,num=0,word=0;
printf("请输入一行英文:\n");
gets(s);
for(i=0;(c=s[i])!='\0';i++) /*依次读取字符,直到遇到空字符结束*/
if(c==' ') word=0; /* 若读取的字符为空则给WORD赋值0*/
else if(word==0) /* 当空格后读取字符不为空时给word赋值1并且NUM加一*/
{
word=1;
num++;
}
printf("本行中共有%d个单词.\n",num);
}
第3个回答  2012-03-09
请问,这样可不可以实现功能
#include "stdio.h"
main()
{
char s[81],c;
int i,num=0,word=0;
printf("请输入一行英文:\n");
gets(s);
for(i=0;(c=s[i])!='\0';i++)
if(c==' ')
num++;
num+=1;
//word=0;
printf("本行中共有%d个单词.\n",num);
}
第4个回答  2012-03-09
#include <stdio.h>
#include <string.h>
main()
{char a[80];
int i,n,c=0;
gets(a);
n=strlen(a);
for(i=0;i<=n-1;i++)
{if(a[i]!=' '&&(a[i+1]==' '||a[i+1]=='\0'))
c++; /*第i个字符不是空格,而第i+1个字符是空格或'\0',表示发现一个单词*/
}
printf("c=%d\n",c);
}