关于c语言scanf()函数用法

做HDOJ第1.2.7题BalloonCames!时遇到一个scanf的问题,如下:①charc;inta,b;scanf("%c%d%d",&c,&a,&b);当我输入... 做HDOJ第1.2.7题Balloon Cames!时遇到一个scanf的问题,如下:

char c;int a,b;
scanf("%c %d %d",&c,&a,&b);
当我输入"+ 1 2"(加号[空格]1[空格]2[回车]),不能正确装进变量c、a、b中。


如果写成:
char s[2];int a,b;
scanf("%s %a %b",s,&a,&b);
输入和上面一样时,a[0]=='+',a[1]==0,a==1,b==2,各个变量都正确赋值。

我想不明白,为什么写成①是错误的,+号明明只有一个字符,%c不是用来获取单字符的吗?
而②却是正确的,如果说是+号后面的空格干扰了,但是空格却没有赋进s[1],到底是为什么请指教!
main代码:
scanf("%d",&n);//①
while(1){
scanf("%c",&t);//②,后来加上,
scanf("%c%d%d",&c,&a,&b);//③
//printf("%d,%d,%d,%d,%d\n",n,t,c,a,b);
}
我的输入是:
3[回车]
+ 1 2[回车]

把①加上后运行正确,
但变量t的值为10。
思考:
如果按照上面我输入的,键盘缓存里的内容应该是:3[回车]+[空格]1[空格]2[回车]
因为①和②是两个独立分开又顺序运行的函数,所以,3赋值给n,[回车]赋值给t,
因为②和③又顺序执行,所以,+赋值给c,
因为c、a、b在同一个scanf中,所以符合格式符之间的空白符都会被忽略掉,
即+和1之间的空格被忽略,1和2之间的空格被忽略,所以,1被赋给a,2被赋给b,
最后的回车没有相应的格式符和变量去装他,所以自动扔掉。

问题解决!
展开
 我来答
gao5521036
高粉答主

2019-11-13 · 醉心答题,欢迎关注
知道小有建树答主
回答量:7225
采纳率:83%
帮助的人:582万
展开全部

scanf是C语言中的一个输入函数,与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include 。(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include 。)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。

金色潜鸟
2014-03-05 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5734万
展开全部
char c;int a,b;
scanf("%c %d %d",&c,&a,&b);
输入 加号[空格]1[空格]2[回车] ,应能正确装进变量c、a、b中。
如果 前面加了空格或回车之类,c 会吃进 空格或回车之类 的键,导致 错误。

如果你想让 c 读得 非空白的字符, 并让输入 有灵活性,可以用:
char c;int a,b;
scanf(" %c %d %d",&c,&a,&b); // 格式 %c 前面添一个空格
printf("%c %d %d\n",c,a,b);
这样,无论你拍入
+ 1 2
或拍入
回车+ 1 2

回车空格 + 1 2
空格空格+ 1 2
表格键 + 1 2
等等,你都能得到 + 1 2 的结果。
=======
同样 在第一个格式"%c" 前添一个空格 " %c":
scanf(" %c",&t);//②,后来加上,
scanf(" %c%d%d",&c,&a,&b);//③
你的输入就有灵活性。
=======
想有意识地读一个空白字符,直接用 getchar()
想有意识地读一行混有空白字符的字符串,用 gets()
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wdwy003
2014-03-04 · TA获得超过2113个赞
知道小有建树答主
回答量:1073
采纳率:0%
帮助的人:1065万
展开全部
char c;int a,b;
scanf("%c %d %d",&c,&a,&b);//不明白你是如何输入的,这句话是正确的,能正确输入
char s[2];int a,b;
scanf("%s %a %b",s,&a,&b);//scanf输入字符串的时候以空格为分隔符,不接受空格
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友21a360264
推荐于2017-11-26 · TA获得超过1856个赞
知道小有建树答主
回答量:640
采纳率:100%
帮助的人:369万
展开全部
新手使用scanf确实很容易在一些隐蔽的地方触礁。常见的scanf规则:
1、格式与类型的对应:最常见的问题是,double类型对应的格式符是%lf,而%f是对应float的,这点与printf不同,不可弄错。
2、大多格式符自身都是不接受空格、列表符、换行等等空白的,会自动忽略前导的空白。唯独%c是不忽略空白的,可以用来获取空白符输入的。
不管是在格式串里还是在输入里,任何一个或多个连续的空白都视为分隔,除非格式串里对应位置是%c格式符。因此用%s格式符无法获取含有空白符的字符串输入。反过来如果在格式串里%c的前面加个空格,那这个空格会帮%c先过滤掉可能存在其前头的一段空白,这是一个技巧。
3、格式符的个数与参数的数量不对应。参数给多了没取得输入值,给少了更糟。
4、scanf是格式化输入,它要求除了空白以外,任何输入必须与格式串一一对应。也就是说如果格式串里面有个逗号,那么在输入的对应位置那里就要输入个逗号,否则就算输入错误(非法字符)。
5、如果一次scanf输入中有多个输入的,只要有一个非法字符(输入格式与需要的不匹配)或其他错误,那么排后面都获取不到输入值,非法字符与后面的字符还滞留在输入流中,等待下次读入。
6、scanf一类标准库函数面向的是流,流是连续的。在一行中输入了过多的东西,会滞留在输入流中,被下次读入时获取。因此有时需要自己略过(跳过)一些没用内容或者清空输入流。
理解流的含义,所有的输入都是按顺序排好队的,读取流的时候也是按顺序一个一个字符读的,不可能跳过前面的字符而读到后面的字符;一个字符被读取了,它就从流里消失了,下一个字符成为流的开头。
因此LZ所说的输入之间的空白,准确的说是对每个格式符而言,他能忽略的是存在其前面的空白。
LZ所说的最后一个回车符其实不是被自动扔掉,而是还留在输入流里,只是还没有相关的输入函数被调用而去读入它。

scanf的使用还有一些技巧:
1、建议:在所有非特定需要空白符的输入时,在格式符%c前面加个空格。
2、scanf有返回值,是成功输入的变量的个数,可以用来检查输入是否成功等情况。
3、带数字的%c格式符,比如"%8c"可以用来获取有固定长度的含空格等的字符输入,用来填充字符数组。%c和%s的区别是%c不区分空白,以及不会在末尾自动添加'\0'。
4、带星号的格式符,比如%*d,可以用来略过(跳过)一些对应格式的输入。比如%*11c跳过包括空白在内11个字符。带星号的格式符不占用scanf参数的个数。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式