提问人:digito_evo 提问时间:12/10/2021 更新时间:12/14/2021 访问量:82
由“std::ios_base::sync_with_stdio( false );”导致的重复输入问题
Duplicate input issue caused by `std::ios_base::sync_with_stdio( false );`
问:
当我在下面使用时,程序会要求第一次输入两次,而它应该要求一次。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
我应该如何修复这个错误?为什么会这样?
答:
1赞
Nimrod
12/14/2021
#1
这里的问题是当你调用时第一次失败putback(\n')
std::ios_base::sync_with_stdio( false );
因此,在您输入内容之前,呼叫会阻塞。ignore
在您的情况下,您键入的第一行“32581”将被忽略。
一个解决方案可能只是删除第一个部分。我认为这里没有必要。put
ignore
评论
0赞
digito_evo
12/14/2021
我应该更改这四个函数的顺序来修复这个错误吗?
0赞
Nimrod
12/14/2021
@digito_evo 在我的回答中更新了。更改顺序可能不是解决方案。
0赞
digito_evo
12/14/2021
这并没有解决问题。if (std::cin.putback( '\n' ))
0赞
Nimrod
12/14/2021
@digito_evo很抱歉,该解决方案尚未经过测试。尝试另一种方式。曾在海湾合作委员会工作 godbolt.org/z/86qWEjfWf
1赞
digito_evo
12/15/2021
我根据你的解决方案找到了另一个解决方案。
评论
OS