鱼C论坛

 找回密码
 立即注册
查看: 4405|回复: 5

一个关于C的问题

[复制链接]
发表于 2013-3-20 17:49:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在小甲鱼的《C++快速入门》教程的第三讲中,有这样一个程序:
#include<stdio.h>
#include<stdlib.h>
int i;
int sum=0;
char ch;
printf("请输入一串整数和任意数目的空格:")
int main()
{
while(scanf("%d",&i)==1)
{
  sum+=i;
  while((ch=getchar())==' ') //小甲鱼说这里是为了屏蔽空格
   ;
  if(ch=='\n')
  {
   break;
  }
ungetc(ch,stdin);

}
printf("结果是:%d\n",&sum);
return 0;
}
但是用以下程序也能实现同样的功能
#include<stdio.h> //无需屏蔽空格,因为对于scanf()函数来说,在输入数据int i,j,sum=0;              //时,遇到空格,就认为是该数据的结束
int main()
{
while(1)
{
  scanf("%d",&i);
  sum+=i;
  if(getchar()=='\n')
  {
   break;
  }
}
printf("%d\n",sum);
return 0;
}
现在问题来了,为什么要屏蔽空格呢?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 19:06:16 | 显示全部楼层

回帖奖励 +1 鱼币

本帖最后由 xhhyi 于 2013-3-20 19:08 编辑

屏蔽空格是为了使下面getchar能接收到\n而break
不过可以把屏蔽空格和获取\n都取消,没什么影响
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-21 13:00:15 | 显示全部楼层
不屏蔽空格getchar()也能得到\n[/b]
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-21 13:00:54 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-21 20:18:48 | 显示全部楼层
本帖最后由 xhhyi 于 2013-3-21 20:26 编辑
847923458 发表于 2013-3-21 13:00
不屏蔽空格,getchar()也能得到\n

例如你输入
5空格空格空格回车
getchar不会遇到回车退出而是遇到空格

它这个函数就是实现,如下
5    7    8    回车
     当scanf接收5后,把后面的空格屏蔽掉,遇到非空格时如果不是\n则再次循环接收字符
而你写的是
5    7   8  回车
    接收5后,下一个字符,即空格,如果不是\n则接收下一个字符7(scanf屏蔽掉空格),所以当到8时,下一个字符不是空格,scanf继续接收,除非接收到一个数后面紧跟着\n才结束while
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-21 21:09:40 | 显示全部楼层
学习了
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-5 10:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表