黑马程序员技术交流社区

标题: 关于scanf后面的“\n”的处理 [打印本页]

作者: 白昼那知夜的黑    时间: 2015-5-25 15:15
标题: 关于scanf后面的“\n”的处理
使用scanf(“%d”,&a)接收的时候,后面的‘\n’被收进哪里去了呢?如果后面再来一句scanf("%c",&b);b会不会变成‘\n’谢谢大神们!

作者: 13673696542    时间: 2015-5-25 15:58
不会,因为scanf()的'\n'是被当作输入结束的标志。
作者: 白昼那知夜的黑    时间: 2015-5-25 17:33
13673696542 发表于 2015-5-25 15:58
不会,因为scanf()的'\n'是被当作输入结束的标志。

哦哦,谢啦
作者: Residual_mem    时间: 2015-5-25 18:07
那是换行符吧- - 跟其他的没关系。。
作者: 天是蓝色的    时间: 2015-5-25 21:07
我看了下面的评论,感觉了解了些
作者: 尹世伟    时间: 2015-5-25 21:09
小细节笔记做起来
作者: yi95392    时间: 2015-5-25 21:34
13673696542 发表于 2015-5-25 15:58
不会,因为scanf()的'\n'是被当作输入结束的标志。

\n会留在缓冲区,并且会被后面的scanf("%c",&b)吸收
作者: kansiliyundi    时间: 2015-5-25 22:19
肯定会啊  scanf里不允许\n的
作者: 张晓珊    时间: 2015-5-25 22:43
到底哪个说的是正确的呢?

作者: huanleabcd    时间: 2015-5-26 09:21
说句实话,没太明白你表达的意思,具体应该看'\n'的位置吧,scanf("%d\n",&a)形式是不允许出现的
作者: 13673696542    时间: 2015-5-26 20:23
yi95392 发表于 2015-5-25 21:34
\n会留在缓冲区,并且会被后面的scanf("%c",&b)吸收

测试了才知道结果,你写两个scanf测试一下。
作者: hi虚无缥缈    时间: 2015-5-26 21:20
\0是字符串结束的标志吧,scanf中不用\n。
作者: woaidd99    时间: 2015-5-26 21:39
没明白什么意思

作者: 这是829    时间: 2015-5-26 21:44
学习了,我也有同样疑问
作者: 李双良    时间: 2015-5-26 22:01
scanf("%d\n",&a)
双引号内除了%d外,其它的必须原样输入;
例如输入456的时候,必须是  456\n  回车
作者: yi95392    时间: 2015-5-26 22:57
13673696542 发表于 2015-5-26 20:23
测试了才知道结果,你写两个scanf测试一下。

早就测过了,\n就是会被吸收,你怎么不试试再回帖.

Snip20150526_1.png (96.95 KB, 下载次数: 174)

Snip20150526_1.png

作者: fixer    时间: 2015-5-27 06:30
围观大神的解答
作者: 星期九    时间: 2015-5-27 09:42
\n是输入结束的标志,你这样输入的话编译的时候编译器会以为你结束输入了,但是实际你什么都没有输入,会报错
作者: chensc    时间: 2015-5-27 19:07
学习学习!
作者: 13673696542    时间: 2015-5-27 20:01
yi95392 发表于 2015-5-26 22:57
早就测过了,\n就是会被吸收,你怎么不试试再回帖.

今天测试了一下,的确是被第二个scanf接收了。不过我看了上课的笔记,老师当时说scanf会将空格、回车、制表符当作终止数据输入。莫非老师当时讲错啦!
作者: 白昼那知夜的黑    时间: 2015-5-28 00:10
13673696542 发表于 2015-5-27 20:01
今天测试了一下,的确是被第二个scanf接收了。不过我看了上课的笔记,老师当时说scanf会将空格、回车、制 ...

额,这个.............
作者: 15578797612    时间: 2015-5-28 09:49
又学到一点了,
作者: 李竞还活着    时间: 2015-6-3 02:49
你从键盘输入一个整数,然后回车,那么这个整数和回车都会被送到电脑中,然后scanf会获取你输入的整数,回车还保留在电脑里等待下一个scanf去获取,如果没有去专门获取,那么这个回车就会在函数结束的时候被释放掉,我是这么理解的。
作者: 李竞还活着    时间: 2015-6-3 02:52
13673696542 发表于 2015-5-27 20:01
今天测试了一下,的确是被第二个scanf接收了。不过我看了上课的笔记,老师当时说scanf会将空格、回车、制 ...

scanf会将连续输入的多个空格回车和Tab忽略掉;
scanf如果去获取多个整数,那么你输入的多个空格回车以及Tab也被系统忽略掉
作者: 任伟    时间: 2015-6-3 06:26
不会的  
作者: huyingbin    时间: 2015-6-3 08:01
不会,回车只是表示输入的字符串结束
作者: 余丽丽    时间: 2015-6-3 10:36
有点晕了。。。。


作者: Elors    时间: 2015-6-3 10:50
学习了:handshake
作者: 余丽丽    时间: 2015-6-3 13:08
http://bbs.itheima.com/thread-201079-1-1.html
作者: 白0702    时间: 2015-6-3 18:24
这个如果%d后面不加\n,你直接回车的话'\n'应该是被存到了缓冲区内然后被后面的句子给吸收掉了,想要破的话就得在%d后加\n,然后键盘中原样输入(需2次回车)才可以。
作者: 白0702    时间: 2015-6-3 18:29
如果%d中不加\n符合时,你键盘输入第一个字符然后回车,此时回车符应该会被存入输入缓冲区内,接着被下一个scanf()语句接收。想要破这个问题,需要在第一个scanf中%d后面加'\n',这样你输入回车就与格式控制相同,则不会被存入缓冲区内。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2