被吞掉的scanf
在编程时使用scanf函数读取char值的时候很容易陷入十分“诡异”的情况
偶尔你会发现scanf函数根本没有起作用,好像在运行时这段代码莫名其妙被吞掉了!
测试代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
char a, b;
scanf("%c", &a);
scanf("%c", &b);
printf("%c\n", a);
printf("%c\n", b);
return 0;
}
运行情况:
jimmy@MyPet:~/code/learnc$ gcc -o test test.c
jimmy@MyPet:~/code/learnc$ ./test
a
a
jimmy@MyPet:~/code/learnc$
看起来我输入了字符'a'回车后一切就结束了,没有让我输入b。
其实这一切都是输入缓冲区在捣鬼。
scanf函数从命令行读取到指定的值后,会将剩余的内容放回输入缓冲区。
在本例中:命令行输入“a[Enter]”-->读取字符'a'放入变量a,[Enter]放回缓冲区-->读取字符[Enter](也就是'\n')放入变量b-->输出a存的字符'a'-->输出b存的字符'\n',OVER。
改进方法:
scanf("%c", &a);
while(getchar() != '\n'); //注意一定要加分号在末尾!
scanf("%c", &b);