C语言之标准缓冲区原理与在使用scanf函数的过程中需要注意的问题

本文探讨了C语言中标准输入缓冲区的工作原理,指出scanf函数用于匹配缓冲区内的数据。当输入数据(如10)及回车被存入缓冲区,scanf按指定格式(如%d)进行匹配。若缓冲区未清空,后续scanf函数将继续匹配,不会触发新的输入。此外,文章还讨论了scanf函数使用中遇到的问题,包括空格、回车的处理,以及如何正确匹配字符和整型数据。
摘要由CSDN通过智能技术生成


一、标准输入缓冲区原理

个人认为,scanf函数真正的作用并不是让我们在控制台窗口输入数据,而是匹配相应的数据,也就是读取数据。那么scanf函数要去哪里匹配数据呢?首先,我们输入数据是以'\n'作为结束的标志,也就是回车,敲完回车后,代表一次输入完成,被输入的数据连带'\n'一起会被存入一个叫标准输入缓冲区的地方,而程序中的scanf函数则是去标准输入缓冲区中进行匹配,例如,如果scanf函数中的控制字符为%d,则scanf函数会去标准输入缓冲区中从第一个数据开始匹配一个整型数字,如果匹配成功,则会把这个整型数字存入对应的变量中。

以下述代码为例,我们定义了一个整型变量i,并使用scanf函数进行输入读取。假设我们输入10,然后敲回车完成输入,此时,被输入的10和回车(也就是'\n')会一并存入标准输入缓冲区等待scanf函数来匹配,由于这个例子中scanf函数中的控制字符为%d,所以scanf函数会在标准输入缓冲区中从第一个数据开始寻找整型数据,如果第一个数据是整型数据,则匹配成功并将这个数据存入对应的变量i中。如果第一个数据不是整型数据,则匹配出错。例如我们输入a10,然后然后敲回车完成输入,此时a、10和'\n'会一起存入缓冲区,而当scanf函数去缓冲区中匹配时发现第一个数据不是整型数据,所以匹配就会失败,当然,变量i的值也不会发生变化。

#include <stdio.h>

int main()
{
   
	int i = 5;
	
	scanf("%d", &i);
	
	printf("%d\n", i);
	
	return 0;
}
  • 思考:下述程序是否可以在黑窗口完成两次输入,也就是能否在黑窗口中输入两次数据?
#include <stdio.h>

int main()
{
   
	int i;
	char c;
	
	scanf("%d", &i);
	printf("i = %d\n", i);

	scanf("%c", &c);
	printf("c = %c\n", c);
	
	return 0;
}

答案是不能,原因如下:首先,第一个scanf函数的控制字符为%d,假设我们正常输入整型数字66,然后敲回车结束第一次输入,于是66和'\n'一起被存入标准输入缓冲区,此时第一个scanf函数开始从缓冲区中的第一个数据匹配,发现第一个数据是整型数据,则成功匹配了66,后将66存入变量i中并输出。此时执行到第二个scanf函数,而我在上面已经强调了scanf函数的作用,其作用是从缓冲区中匹配数据而不是让我们去输入数据,当66被第一个sc

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值