一、标准输入缓冲区原理
个人认为,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