在C语言中,当scanf
函数无法匹配格式字符串中指定的类型时,它会将输入流中的字符保留在缓冲区中,并且这些字符会留在输入行中。这意味着在下一次调用scanf
函数时,这些字符将继续被读取。
下面是一个示例代码:
#include <stdio.h>
int main() {
int num1=-1,num2=-1,num3=-1;
printf("%d %d %d",num1,num2,num3);
scanf("%d %d %d",&num1,&num2,&num3);
printf("%d %d %d",num1,num2,num3);
return 0;
}
输入是:
2 a 3
输出结果是:
-1 -1 -1
2 -1 -1
可以明显地看到,除了2以外,其他都赋值失败了。
原因是因为输入中的a和num2的%d不匹配,所以num2将赋值失败,不会改变原值。
但scanf并不会将a清除,于是a继续留在输入区,导致之后num3的%d赋值也失败,num3也不变。.
在调用scanf
函数时,除了%c以外(例如%d或%s),如果输入的第一个字符是空格或回车,则scanf
会继续等待下一个非空白字符的输入。
下面是一个示例代码:
#include <stdio.h>
int main() {
char s[1024]={0};
scanf("%s",&s);
printf("%s",s);
return 0;
}
输入是:
abcd
输出是:
abcd
这条输入开始的字符是一连串的空格,因为占位符是%s,所以scanf会在遇到有效字符前,把刚开始的回车和空格全部清除,遇到有效字符a后才开始正常输入,最后遇到回车或空格后结束输入