由`std::ios_base::sync_with_stdio(false);`引起的重复输入问题
Posted
技术标签:
【中文标题】由`std::ios_base::sync_with_stdio(false);`引起的重复输入问题【英文标题】:Duplicate input issue caused by `std::ios_base::sync_with_stdio( false );` 【发布时间】:2022-01-15 04:38:34 【问题描述】:当我在下面使用std::ios_base::sync_with_stdio( false );
时,程序会询问第一个输入两次,而它应该询问一次。
#include <iostream>
#include <array>
#include <limits>
int main( )
// std::ios_base::sync_with_stdio( false ); // uncommenting this line cause
// the said problem
std::array<char, 168> buffer1 ;
std::array<char, 168> buffer2 ;
std::cin.putback( '\n' );
std::cin.clear( );
std::cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n' );
std::cin.getline( buffer1.data( ), 168 );
std::cin.putback( '\n' );
std::cin.clear( );
std::cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n' );
std::cin.getline( buffer2.data( ), 168 );
std::cout << "\nbuffer1:\n" << buffer1.data( ) << '\n';
std::cout << "buffer2:\n" << buffer2.data( ) << '\n';
std::cout << "\nEnd" << '\n';
return 0;
我希望代码要求输入两次,一次用于buffer1
,一次用于buffer2
,但这会发生:
32581 // as can be seen, here I enter a random character sequence for buffer 1 but it doesn't store it in buffer1 and asks for input again
12345 // Instead, this sequence gets stored in buffer1
abcde // buffer2 has no problem, this gets stored in buffer2 successfully
buffer1:
12345
buffer2:
abcde
End
但是,避免使用std::ios_base::sync_with_stdio( false );
修复了这个错误:
32581
abcde
buffer1:
32581
buffer2:
abcde
End
我应该如何修复这个错误?为什么会这样?
【问题讨论】:
你在用什么OS
?我无法重现您的问题。
@WBuck Windows 10 和命令提示符。
@WBuck 我已经在 Command Prompt 和 PowerShell 上对其进行了测试。
是否有任何必要的理由将其设置为 false?
【参考方案1】:
这里的问题是第一个putback(\n')
调用失败
std::ios_base::sync_with_stdio( false );
所以调用 ignore
会阻塞,直到您输入内容。
在您的情况下,您输入“32581”的第一行将被忽略。
解决方案可能只是删除第一个 put
到 ignore
部分。我认为这里没有必要。
【讨论】:
我应该改变这四个函数的顺序来修复这个错误吗? @digito_evo 在我的回答中更新。更改顺序可能不是解决方案。 这个if (std::cin.putback( '\n' ))
没有解决问题。
@digito_evo 抱歉,该解决方案未经测试。尝试另一种方式。在海湾合作委员会工作godbolt.org/z/86qWEjfWf
我根据你的方法想出了另一个解决方案。以上是关于由`std::ios_base::sync_with_stdio(false);`引起的重复输入问题的主要内容,如果未能解决你的问题,请参考以下文章
由 coercion 引入的 NAs 由 knn 中的 coercionError 引入
如何区分两个“onpause”事件 - 由单击“暂停”按钮引起,以及由到达媒体片段末尾引起?
Nginx实现动静结合(动态资源由tomcat管理: 静态资源由Nginx管理)