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

"本文探讨了在C语言中使用scanf函数时遇到的多余输入问题,特别是当格式化字符串包含' '时的情况。问题在于,' '并未被读取,而是作为输入结束的标志。正确做法是使用scanf("%d",&a)后,通过getchar()来处理换行符。文章通过实例代码展示了这个问题,并强调了scanf会忽略先导空白符的特性,以及读取字符串时末尾会包含编译器添加的' '。"
摘要由CSDN通过智能技术生成

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还留在缓冲区中。

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值