c++/c里面的输入缓冲区

        我们在使用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 , 不会跳过任何字符。

发布了78 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43657442/article/details/103711667