由“std::ios_base::sync_with_stdio( false );”导致的重复输入问题

Duplicate input issue caused by `std::ios_base::sync_with_stdio( false );`

提问人:digito_evo 提问时间:12/10/2021 更新时间:12/14/2021 访问量:82

问:

当我在下面使用时,程序会要求第一次输入两次,而它应该要求一次。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;
}

我希望代码请求输入两次,一次,一次,但发生了这种情况:buffer1buffer2

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

我应该如何修复这个错误?为什么会这样?

C++ IO IO流 CIN

评论

0赞 WBuck 12/10/2021
你在用什么?我无法重现您的问题。OS
0赞 digito_evo 12/10/2021
@WBuck Windows 10 和命令提示符。
0赞 digito_evo 12/10/2021
@WBuck我已经在命令提示符PowerShell 上对其进行了测试。
0赞 Nimrod 12/14/2021
有什么必要的理由将其设置为假吗?

答:

1赞 Nimrod 12/14/2021 #1

这里的问题是当你调用时第一次失败putback(\n')

std::ios_base::sync_with_stdio( false );

因此,在您输入内容之前,呼叫会阻塞。ignore

在您的情况下,您键入的第一行“32581”将被忽略。

一个解决方案可能只是删除第一个部分。我认为这里没有必要。putignore

评论

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
我根据你的解决方案找到了另一个解决方案。