我们在使用scanf或者getchar或者gets收入数据时,从键盘输入的数据,都是先进入”输入缓冲区“。scanf先在输入缓冲区中检查时候有数据,如果输入缓冲区中有数据,就直接从输入缓冲区中读取数据。如果输入缓冲区中是空的,程序就会暂停,等待用户输入数据。
比如:scanf("%c", &x);
如果 输入abc和回车, 但是实际只读一个字符,所以输入缓冲区中还会剩下 'a'
, 'b'
和 '\n'
如果后面还有一个输入语句:scanf("%c", &y);
或者 y = getchar();
此时就直接从输入缓冲区中读取一个字符 'b'
,用户就没有机会输入数据了。
或者右面还有一个输入语句:scanf(("%d", &y);
此时直接从输入缓冲区中读取一个整数,但是输入缓冲区中是’a’
和’b’
, 并不是整数,导致用户没有机会输入数据,而去把’a’
和’b’
当整数输入,结果当然是输入失败。
如果输入缓冲区中还剩下数据,就导致后面的scanf
或者getchar
语句执行时,程序不会暂停让用户输入,而是直接从输入缓冲区中获取数据。
如果输入缓冲区中还有回车符,就会导致后面的gets
语句执行时,程序不会暂停让用户输入,而是直接从输入缓冲区中读取一个空行!(就是一个空字符串),因为 gets是遇到回车符符就结束。
为了解决这个问题,就可以使用 fflush(stdin)
; fflush(stdin) 就会把输入缓冲区的所有数据都清空。使得后面的scanf
或者getchar
能够暂停,让用户重新输入新的数据。
补充:scanf语句中使用 %d
或者 %f
或者 %lf
时,会自动跳过空格,回车符,和制表符。如果只有%c
, 不会跳过任何字符。