首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

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

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

C/C++ code
//code 1void 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;}个人倾向于用你的第二段代码。
[解决办法]
噢,第二个能处理末尾。。也能处理头空格,第二个好!

热点排行