问题代码

1

这一串代码就是输出提示,读取输入,这样做3遍

但是看到运行结果会发现,第二个和第三个的提示字符串输出到同一行了,没法输入操作符

原因

这是因为输入缓冲区的缘故

当我们输入第一个数字1的时候,按下回车确认,但同样的,回车的 换行符也同样保留在输入缓冲区了, 数字1被读取消耗掉了,所以输入缓冲区中只剩下换行符,当我们运行到第二个scanf的时候,它就直接读取了输入缓冲区中的换行符了,所以也就造成了我们看到的结果,直接略过了运算符的输入,要解决这个问题,我们就得在 每个scanf读取输入缓冲区时,保证输入缓冲区的干净

解决

  • 使用 fflush(stdin) 刷新输入缓冲区
    2

但是这个方法有些平台不适用,编译无法通过

  • 使用 getchar() 消耗掉换行符
    3

所以有的时候,我们也可以通过循环的getchar()实现刷新输入缓冲区的功能

还有若是使用 setbuf(stdin, NULL) 禁用输入缓冲区也无法解决这个问题,这是因为,scanf还是会正常工作,等待用户按下回车确认

*** 输入缓冲区内的数据被getchar()等函数读取后,会从缓冲区中移除掉***

拓展

由输入缓冲区的问题,自然有输出缓冲区的问题,可以使用 flush(stdout) 立即刷新输出缓冲区,或者使用 setbuf(stdout, NULL) 不设置输出缓冲区

然后禁用缓冲区,缓冲区仍旧存在,只不过是不适用它了

开启缓冲区时,底层的read和write并不直接从文件流(stdin和stdout)中拿数据,而是从对应流的缓冲区中拿数据

禁用缓冲区后,底层的read和write直接从文件流中拿数据

所以缓冲区是否禁用不会影响数据本身,影响的是访问数据的方式

 posted on 2024-10-13 23:19  Dylaris  阅读(67)  评论(0)    收藏  举报