关于ios::sync_with_stdio(false)的一些问题

使用ios::sync_with_stdio(false)可以让cin读入的更快,它的原理是使本该同步的输入输出流分开,就是让c风格的输入输出流和c++的输入输出流分开。

举一个具体的例子,在正常c++中,当我们用cin输入整数,当我们在键盘上输入的时候,我们输入的东西进到了缓冲区,假设我们输入了

6 3

两个数之间有空格,最后有回车

这些东西都进入了缓冲区,然后cin从缓冲区中读取这些字符,cin会一直读取到空格或者回车,第一个cin读到6,6之后的空格没有读,还在缓冲区中,接下来第二个cin会忽略掉空格,读取了3,在读到回车前结束,这时候缓冲区中还有个回车,如果接下来我们想用gets来读取字符串,那么gets会读到回车后结束,因为这时候缓冲区中正好就有个回车,所以gets会直接读到那个回车,然后结束读入,所以我们输入的字符并没有被gets读到,一般这个时候都会再定义一个字符c来吃掉回车。

如果这时候,我们在前边写了ios::sync_with_stdio(false)那么c的缓冲区和c++的缓冲区就会分开,还是进行和刚才同样的操作的话,这时候cin后的回车停留在了c++的缓冲区中,而gets是c函数,所以这时候gets是从c的缓冲区中读入字符,而这时c的缓冲区什么也没有,所以gets就等待输入,所以我们就把字符输入进了gets,而并没有用到用来吃掉回车的字符。

posted @ 2020-07-28 21:09  ice--cream  阅读(1305)  评论(0编辑  收藏  举报