求助:一个C语言学习过程中的习题

软件和网站开发以及相关技术探讨
回复
头像
微风成长
帖子: 644
注册时间: 2008-12-14 18:43
联系:

求助:一个C语言学习过程中的习题

#1

帖子 微风成长 » 2009-03-04 21:48

编写一个用于统计即时输入一段文字的空格的数目。最好能提供整个程序,虽然我遇到的问题只是不知道在程序中怎样表示空格。谢谢。
头像
tregedie
帖子: 578
注册时间: 2008-11-29 22:56
来自: Guangdong Pharmaceutical University
联系:

Re: 求助:一个C语言学习过程中的习题

#2

帖子 tregedie » 2009-03-04 23:40

通过ASCII来判断
猪圈里的猪想着去解放全世界
头像
lerosua
论坛版主
帖子: 8455
注册时间: 2007-11-29 9:41
联系:

Re: 求助:一个C语言学习过程中的习题

#3

帖子 lerosua » 2009-03-04 23:57

就是空格啰,呵呵
头像
windwhinny
帖子: 618
注册时间: 2007-09-26 17:34

Re: 求助:一个C语言学习过程中的习题

#4

帖子 windwhinny » 2009-03-05 0:02

#include<stdio.h>
int main()
{
char *str="i am superman";
int i=0,n=0;
for(i=0;*(str+i)!='\0';i++)
if(str==' ')
n++;
printf("n=%d\n",n);
return 0;
}
头像
ebok
帖子: 852
注册时间: 2008-02-15 0:09

Re: 求助:一个C语言学习过程中的习题

#5

帖子 ebok » 2009-03-05 0:16

LZ说的是即时输入,LS的还要加个 scanf 改一下,
Somebody think they are full of niubility, so they play a zhuangbility, but only reflect their shability.
头像
windwhinny
帖子: 618
注册时间: 2007-09-26 17:34

Re: 求助:一个C语言学习过程中的习题

#6

帖子 windwhinny » 2009-03-05 0:49

ebok 写了:LZ说的是即时输入,LS的还要加个 scanf 改一下,
我试过了,scanf遇到空格就终止了
头像
微风成长
帖子: 644
注册时间: 2008-12-14 18:43
联系:

Re: 求助:一个C语言学习过程中的习题

#7

帖子 微风成长 » 2009-03-06 18:44

谢谢大家的帮助。

我已经写了一个管用的程序,如下:

代码: 全选

#include <stdio.h>
int main()
{
        long c,n;
        n=0;
        while((c=getchar())!='/n')
                 if (c=='  ')
                 ++n;
        printf("%d\n",n);
}
经测试在输入一段文字后,按“Enter”键 程序将自动计算其中的空格数目。


4楼Windwinny的程序中,for这句:
“for(i=0;*(str+i)!='\0';i++)”和“if(str==' ')”中的
'*(str+i)'、'\0'、'str',不太明白是什么意思。
可能是还没学到这些概念吧,因为我还在学习中……
:em27
头像
princelai
帖子: 920
注册时间: 2007-01-06 21:00
联系:

Re: 求助:一个C语言学习过程中的习题

#8

帖子 princelai » 2009-03-06 19:23

微风成长 写了:谢谢大家的帮助。

我已经写了一个管用的程序,如下:

代码: 全选

#include <stdio.h>
int main()
{
        long c,n;
        n=0;
        while((c=getchar())!='/n')
                 if (c=='  ')
                 ++n;
        printf("%d\n",n);
}
经测试在输入一段文字后,按“Enter”键 程序将自动计算其中的空格数目。


4楼Windwinny的程序中,for这句:
“for(i=0;*(str+i)!='\0';i++)”和“if(str==' ')”中的
'*(str+i)'、'\0'、'str',不太明白是什么意思。
可能是还没学到这些概念吧,因为我还在学习中……
:em27


这个要不明白还是继续深入学习吧,这才是C的精华所在,虽然只是精华的皮毛

代码: 全选

 while((c=getchar())!='/n')
你这句的顺序是先get字符,然后赋值给c,然后比较,所以回车会赋值给c,你可以这样

代码: 全选

  printf("%d\n",n);
变成

代码: 全选

  printf("%d\n",n-1);
或者

代码: 全选

 while(c=getchar()!='/n')
按照教科书上,c=getchar()必须引起来的,因为赋值的优先度低,但是“错误”的方法有时 能做正确的事情

你试试吧,好久不动C了
头像
微风成长
帖子: 644
注册时间: 2008-12-14 18:43
联系:

Re: 求助:一个C语言学习过程中的习题

#9

帖子 微风成长 » 2009-03-06 22:51

明白你的意思。但是很反对你的观点。

代码: 全选

while((c=getchar())!=' '
是先把输入的字符赋值给c,不管它是不是空格都给c。所以,当c等于空格时,就中断循环。
而你的意思是,输入的字符要是空格的话,就不赋值给c,因此,这时c就没有值,所以就中断循环。
这样看,逻辑上执行效果是跟加括号一样的。
但是当while进行过若干次循环后,c的当前值肯定不是空格,而getchar()为空格时,c又不会被赋值,所以c保留原当前值,这样循环会无限制的进行下去,因为空格中断循环控制已经无效了。
另外,就算是第一次循环判断用getchar=空格的话,c没有赋值,也不能保证c的默认初值就是空格,所以也很有可能中断循环无效。
所以,还是原来的程序正确。去掉括号的改法,如上文所述,问题相当大。
上次由 微风成长 在 2009-11-13 11:35,总共编辑 1 次。
头像
微风成长
帖子: 644
注册时间: 2008-12-14 18:43
联系:

Re: 求助:一个C语言学习过程中的习题

#10

帖子 微风成长 » 2009-03-07 16:28

补充:
刚验证了一下,getchar()!='\n'的值在非'\n'的输入时,值为1;在'\n'时为0.由下列程序验证:

代码: 全选

#include <stdio.h>
main()
{
        long c;
        c=getchar()!='\n';
        printf("%d\n",c);
}
同时说明只把printf("%d\n",n);改为n-1是永远得不到正确结果的。
回复