#include<stdio.h>
int main(void)
{
int i, j;
printf("请输入i的值:");
scanf_s("%d\n", &i);
printf("请输入j的值:");
scanf_s("%d\n", &j);
printf("i = %d , j = %d", i, j);
return 0;
}
我知道将scanf函数里面的\n去掉就正确,但我想知道为什么会出现这样的结果,为什么最终 j 的值为2而不是3
scanf函数会读入格式化内(就是双引号内的)的所有空白包括空格换行符等,一直遇到输入的第一个非空白字符才会结束读取。
在这一语句中
scanf("%d\n", &i);
当你输入1时,缓冲区变成
1 空白字符 因为这缓冲区后面没有非空白字符,所以会继续要求你输入,当你再次输入2时,scanf就会结束输入,把你第一次输入的1存入i中,而把你第二次输入的2留在缓冲区中。
再次调用scanf时,缓冲区里面留着的2优先存入到了j中,缓冲区里面的内容相当于队列先进去的肯定会先出来的,而你再次输入3时,这个3被留在了缓冲区了。你输入3相当于让此函数终止。因为它遇到非空字符作为终止,以空格作为分隔单位的。
scanf("%d\n", &j);
说了那么多。不知道你看得懂没??
scanf中除了%d这样的占位符以外,尽量不要随便加其它内容,任何增加的内容,都要求在输入时完全匹配,否则函数就不能正确识别输入信息中哪些是与占位符匹配的内容
比如scanf("%d,%d",&a,&b);那么在输入时,两个整数之间必须加逗号分隔
比如scanf("%d\n",&a);在输入整数后,必须按两次回车才能完成整数输入,第一个回车就是与\n匹配的