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


一、标准输入缓冲区原理

个人认为,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'

猜你喜欢

转载自blog.csdn.net/weixin_65334260/article/details/125333927