| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1334 人关注过本帖
标题:关于scanf的问题
只看楼主 加入收藏
zhangx378
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2016-9-29
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:7 
关于scanf的问题
#include<stdio.h>
int main()
{
    int a;
    char b;
    scanf("%d",&a);
    printf("%d\n",a);
    scanf(" %c",&b);//%c前有一个空格。
    printf("%c\n",b);
    return 0;
 }
请问为什么第二个scanf中不打空格的话输入第一个数就会直接跳过第二次输入,显示出两行空格?听人说打空格可以避免第一个Enter被第二输入吸收,为什么?
搜索更多相关主题的帖子: return Enter 
2016-11-03 22:33
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
%c遇Enter自动执行,%c执行带了一个Enter,本来输入Enter又自带了一个,所以在%c输入Enter时总共有带了两个Enter。
如果是%d则没有这种问题。
我凭直感推断,编译器开始执行编译时便自带一个Enter,直到Enter被吸收或者结束程序才会暂停编译。
这也可以解释为什么对%d输入Enter会重新输入,因为%d吸收了Enter,编译器没有接受到Enter便不会进行下一步执行。


____________-不好意思,经过测试,第一行为错解……因为也许有人会看过该帖,删了后便可能会产生歧义,还是先保留错解
等待大神们的正解吧。

[此贴子已经被作者于2016-11-3 23:40编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-03 23:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
scanf中任何一个空白字符,表示略过连续的所有空白字符
2016-11-04 00:45
魑魅
Rank: 1
等 级:新手上路
帖 子:77
专家分:9
注 册:2016-9-18
收藏
得分:0 
因为你第二个scanf读取的是一个字符,如果没有空格直接回车,会直接退出运行,因为回车也是一个字符,所以要在%c前面加一个空格。
2016-11-04 07:22
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
回复 2楼 九转星河
新的解释:scanf按Enter后编译器会另外返还一个Enter。输入时编译器只对符合输入格式的字符进行编译,输入无效的则略过后面所有。%c是接收Enter的
你可以试一下这行代码:scanf("%c%c",&a,&a);输入一个Enter,你会发现连续跳了两行。

[此贴子已经被作者于2016-11-4 09:02编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-04 09:00
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:10 
scanf会自动跳过所需数据前面的所有空白符(包括空格回车换行制表符等等)(除了%c,%c不管遇到什么字符都能读)

...还是直接上链接(百度百科 scanf词条)吧,关于scanf的一些事讲起来还蛮复杂的。。。
http://baike.baidu.com/link?url=leOtvVxcVyEKQkoZ7SyfaA27A7e_Wy7sVrSUotwkNc8nCNQRBSkqNOz9ESdKoGwhNS3jThVU8Of9qZT9wyE_-q
(重点关注后面的“注意问题”,里面提到了缓冲区的概念。)

φ(゜▽゜*)♪
2016-11-04 09:43
zhangx378
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2016-9-29
收藏
得分:0 
回复 6楼 书生牛犊
好的,谢谢
2016-11-04 12:49
StadyC
Rank: 6Rank: 6
等 级:侠之大者
威 望:6
帖 子:182
专家分:430
注 册:2016-10-13
收藏
得分:0 
可以再第二个scanf前,写一句:getchar();
2016-11-04 13:40
快速回复:关于scanf的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021864 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved