scanf(“%d “)多余输入问题及 的读入问题

Posted joker D888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scanf(“%d “)多余输入问题及 的读入问题相关的知识,希望对你有一定的参考价值。

scanf("%d\\n")多余输入问题及\\n的读入问题

前言

原问题是想在输入数字后把缓冲区的\\n也读走,以方便后续的字符串输入工作,而这样想要scanf("%d\\n")直接读走\\n引发的问题引起了我的思考,虽然知道这样做不行,但想要之所以然,于是此博文诞生,问题简化如下。

#include<stdio.h>
int main(void)
{
	int a;
	scanf("%d\\n", &a);
	return 0;
}
//比如输入1\\n2\\n后程序方可结束

一个简单的输入问题,本意是输入一个整数按下回车后就结束程序,但实际程序却需要输入数字\\n数字\\n,第二个数字不一定非得是数字,只要是非空白符即可(空白符:指空格符、制表符、回车符)。为什么会这样呢?

原因

其实是因为scanf的格式化控制字符串有个特点,就是除了标准控制串(以%打头的那些)外,写入了什么就会在那个环节上等待输入什么,否则不会正确往下走。你在%d后写了\\n,那么,当接收一个整数后就等待输入\\n,等着了就往下走。所以第一次那个\\n是被%d后的\\n收走;第二次输入的数字2由于已经没有对应的变量接收了,所以还留在输入缓冲区里。第二次输入的\\n被当作输入结束命令启动对应变量接收数据。所以最后a得到的是第一次输入的数据。所以正确的写法应该scanf("%d",&a)后用getchar()读走\\n,再进行后续的字符/字符串操作。

空口无凭,代码论证。

按如上代码进行调试,还是输入1\\n2\\n来验证。

可以看出,确实如上述一般,1\\n由scanf读走了,虽然scanf是通过第二个\\n来结束输入的,但并不会把字符读走,只是检测,所以后续的c读走了2,d读走了\\n。

补充

除了scanf("%c"),scanf有一个特性——忽略先导的空白符,只要他们连续的出现在缓冲区的开头,不管有多少个连续的空白符,scanf都会把其读走并丢弃,直到遇到非空白符,再读入有意义的字符。

scanf都会把其读走并丢弃,直到遇到非空白符,再读入有意义的字符。

读取字符串的时候,比如读aaa\\n,你读入字符串最后会带有\\n,这个\\n并不是你输入的\\n,而是编译器自己添加的,你自己输入的\\n还留在缓冲区中。

以上是关于scanf(“%d “)多余输入问题及 的读入问题的主要内容,如果未能解决你的问题,请参考以下文章

字符串处理scanf("%d%*c",&n);

c++第二遍scanf读入问题

scanf(%d),连续输入数字和字符(一条无空格字符串)

scanf(%d),连续输入数字和字符(一条无空格字符串)

C++ 输入输出知识点(持续更新)

C++ 输入输出知识点(持续更新)