问题代码
这一串代码就是输出提示,读取输入,这样做3遍
但是看到运行结果会发现,第二个和第三个的提示字符串输出到同一行了,没法输入操作符
原因
这是因为输入缓冲区的缘故
当我们输入第一个数字1的时候,按下回车确认,但同样的,回车的 换行符也同样保留在输入缓冲区了, 数字1被读取消耗掉了,所以输入缓冲区中只剩下换行符,当我们运行到第二个scanf的时候,它就直接读取了输入缓冲区中的换行符了,所以也就造成了我们看到的结果,直接略过了运算符的输入,要解决这个问题,我们就得在 每个scanf读取输入缓冲区时,保证输入缓冲区的干净
解决
- 使用 fflush(stdin) 刷新输入缓冲区
但是这个方法有些平台不适用,编译无法通过
- 使用 getchar() 消耗掉换行符
所以有的时候,我们也可以通过循环的getchar()实现刷新输入缓冲区的功能
还有若是使用 setbuf(stdin, NULL)
禁用输入缓冲区也无法解决这个问题,这是因为,scanf还是会正常工作,等待用户按下回车确认
*** 输入缓冲区内的数据被getchar()等函数读取后,会从缓冲区中移除掉***
拓展
由输入缓冲区的问题,自然有输出缓冲区的问题,可以使用 flush(stdout)
立即刷新输出缓冲区,或者使用 setbuf(stdout, NULL)
不设置输出缓冲区
然后禁用缓冲区,缓冲区仍旧存在,只不过是不适用它了
开启缓冲区时,底层的read和write并不直接从文件流(stdin和stdout)中拿数据,而是从对应流的缓冲区中拿数据
禁用缓冲区后,底层的read和write直接从文件流中拿数据
所以缓冲区是否禁用不会影响数据本身,影响的是访问数据的方式
标签:输出,读取,禁用,C语言,乱序,缓冲区,换行符,输入 From: https://www.cnblogs.com/dylaris/p/18463175