关于scanf的问题

小枫 2010-04-13 11:06:07
int i,j;
scanf("%d,%d",&i,&j);

如果输入1,2输出的话,j=2.要是在1和逗号之间加个空格,j不会是2,说是scanf的严格匹配的问题,但是要是再逗号后面加个空格,为什么j还是2呢,
同样要是把i,j定义为char,不管在什么地方加空格,j都不会被赋值为你你输入的那个字符。
...全文
156 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
super_loverax 2010-12-09
  • 打赏
  • 举报
回复
是啊,会出现这种情况的。如果输入的是数据,那么按照它的格式可以匹配就行了。但是如果输入的是字符,那么就必须注意了。scanf("%c%c",&i,&j);这样输入的两个字符必须是连续输入而不能有空格的,因为空格本身就是一个字符,所以当已经将两个字符赋值完毕后就完了。
huanmie_09 2010-04-13
  • 打赏
  • 举报
回复
楼主了解scanf函数的匹配方式就好了:
scanf匹配非字符型(格式控制串不为%c)内容的时候,忽略前后的空格.
拿楼主的问题来说吧,
格式控制串为%d,%d.
楼主从键盘输入1, 2时,这时输入的值并没有立即存储到变量i和j中,而是放在键盘缓冲区。
然后就是scanf函数开始工作了.
第一个%d匹配键盘缓冲区里的1, 为数字类型,然后尝试在匹配下一个字符,而下一个字符为',', 不属于整形数能表示的范围.因此,第一个%d匹配结束,同时将','字符放回到键盘缓冲区。这时键盘缓冲区的内容为", 2";
然后是控制串里','开始匹配,正好与键盘缓冲区里的','字符匹配;此后键盘缓冲区的内容为" 2";
第二个%d开始匹配,忽略前面的空格,匹配到数字2,然后再尝试匹配,发现键盘缓冲区里为空了。
scanf函数结束工作。
因此i=1, j=2。

如果把格式控制串为%d%d.
输入同样为"1, 2"时,
第一个%d匹配键盘缓冲区里的1, 为数字类型,然后尝试在匹配下一个字符,而下一个字符为',', 不属于整形数能表示的范围.因此,第一个%d匹配结束,同时将','字符放回到键盘缓冲区。这时键盘缓冲区的内容为", 2";
第二个%d开始匹配,同样它将与键盘缓冲区里的','字符进行匹配,匹配失败。此后键盘缓冲区的内容为", 2";

scanf函数结束工作。
i=1, j没有初始化.
楼主可以在本次scanf函数调用后,
再加一句:
scanf("%c%c%d", &ch1, &ch2, &j);
你会发现ch1为',', ch2为' ', j=2.

liyanlin122 2010-04-13
  • 打赏
  • 举报
回复
scanf输入数据时,数字之间加 空格或回车 来分隔
xiuxianshen 2010-04-13
  • 打赏
  • 举报
回复
因为你用的是“%d,%d”的格式
如果定义为char,还是用上面的格式,当然得不到j了

69,394

社区成员

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

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