这两个程序哪一个好一点,为什么?

南气子水 2010-05-02 05:54:06
题目:输入一行字符串,统计其中有多少个单词,单词之间用空格分隔开。

//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
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);
}
...全文
164 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
H352296390 2010-07-05
  • 打赏
  • 举报
回复
第一个code:如果开头有n(n〉0)个空格,则会出错
第二个code:如果两个单词之间隔也是n个空格,则也会出错
黑娃 2010-05-02
  • 打赏
  • 举报
回复
噢,第二个能处理末尾。。也能处理头空格,第二个好!
黑娃 2010-05-02
  • 打赏
  • 举报
回复
en~~~第二个的确是能处理多空格,但是不能解决开始空格。且两个都不能很好得解决最后末尾,我建议你用stringstream来加以计算
南气子水 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 falcomavin 的回复:]
如果最后一个单词后面没有空格,这两个算法都会把最后那个单词漏掉哦。
第二个算法是以空格个数来计算单词的,如果某两个单词中间有多个空格,那么它会多计算很多哦。而且第二个算法也不能正常处理一开始就是空格的哦。

综上所诉,第一个好一点
[/Quote]
第二个对于多空格可以处理的,因为有一个word标志,您可以仔细看下~~~~~
黑娃 2010-05-02
  • 打赏
  • 举报
回复
如果最后一个单词后面没有空格,这两个算法都会把最后那个单词漏掉哦。
第二个算法是以空格个数来计算单词的,如果某两个单词中间有多个空格,那么它会多计算很多哦。而且第二个算法也不能正常处理一开始就是空格的哦。

综上所诉,第一个好一点
huanmie_09 2010-05-02
  • 打赏
  • 举报
回复
严格来说,楼主这两段程序并不等价。
第一段程序只判断了小写字母所组成的单词,而第二段则没有限制.
1楼已经提了,gets输入不检查越界,可能会溢出。这也是一个不安全的因素。用fgets是可以,但要注意最后可能会将回车符保存到字符串。
当然,也可以自己写一个函数。如:

/*接受输入的前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;
}
个人倾向于用你的第二段代码。

lwd4210 2010-05-02
  • 打赏
  • 举报
回复
如果只是输入几个单词,算一下有多少个这个两个方法无所谓好坏。

你用你学的软件工程,算下FOR的次数,算下开销,也没多大区别。

但如果上w,一个文件里面有几kw个单词,怎么算出来效率高,这才值得考虑。

呵呵,个人意见啊。
fx397993401 2010-05-02
  • 打赏
  • 举报
回复

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);
}

运用 strtok 来计算
shiweifu 2010-05-02
  • 打赏
  • 举报
回复
用指定分词,完全可以用strtok。。肯定比自己写好一些
shiweifu 2010-05-02
  • 打赏
  • 举报
回复
获取字符串用fgets()比较好,避免缓冲区溢出

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧