这两个程序哪一个好一点,为什么?该如何处理

这两个程序哪一个好一点,为什么?
题目:输入一行字符串,统计其中有多少个单词,单词之间用空格分隔开。
C/C++ code

//code 1
void main()
{
    char str[81];
    int count=0,i;
    gets(str);
    for(i=0;str[i]!='\0';i++)
    {        
        if(str[i]==' ' && str[i+1]>='a' && str[i+1]<='z')//如果一个字符后面是字母,表示一个单词开始
        {
            count++;
        }        
    }
    if(str[0]!=' ')//如果一句话开头不是空格而是单词,上面的方法,会把第一个词漏掉,这里补上
    {
        count=count+1;    
    }        
    printf("There are %d words in the line.\n",count);
}


//code 2
C/C++ code
void main()
{
    char string[81];
    int i,num=0,word=0;//num单词数累加
    char c;
    gets(string);
    for(i=0;(c=string[i])!='\0';i++)
    {
        if(c==' ')//c是空格,word置0
        {
            word=0;
        }
        else if(word==0)//c不是空格,并且前面一个字符是空格(即word=0),新单词开始,num累加,word置1
        {
            word=1;
            num++;
        }
    }
    printf("There are %d words in the line.\n",num);
}



------解决方案--------------------
获取字符串用fgets()比较好,避免缓冲区溢出

------解决方案--------------------
用指定分词,完全可以用strtok。。肯定比自己写好一些
------解决方案--------------------
C/C++ code

int main()
{
    char str[81];
    char *taken;
    int count=0,i;
    gets(str);
    taken = strtok( strdup(str)," ");
    while (taken != NULL)
    {
        count ++;
        taken = strtok( NULL," ");
    }
    printf("There are %d words in the line.\n",count);
}

------解决方案--------------------
严格来说,楼主这两段程序并不等价。
第一段程序只判断了小写字母所组成的单词,而第二段则没有限制.
1楼已经提了,gets输入不检查越界,可能会溢出。这也是一个不安全的因素。用fgets是可以,但要注意最后可能会将回车符保存到字符串。
当然,也可以自己写一个函数。如:
C/C++ code

/*接受输入的前n个字符保存到str中*/
char *getline(char *str, int n) 
{
    int ch;
    int len = 0;
    while((ch=getchar()) != '\n' && len < n) {
        str[len++] = ch;
    }
    str[len] = '\0';
    return str;
}
个人倾向于用你的第二段代码。

------解决方案--------------------
噢,第二个能处理末尾。。也能处理头空格,第二个好!