c++ 即使在使用std::cin.ignore()后,std::cin也会被跳过

vxf3dgd4  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(174)

我试图找到一种方法,即使在使用std::cin.fail()进行了无效输入之后,也能继续请求用户输入。然而,当输入无效时,程序只是在循环中运行,即使使用std::cin.ignore()也不会在std::cin上暂停。
我试着将std::cin.ignore()移到std::cin >> input之前,虽然它确实工作,但程序首先停在std::cin.ignore()行(首先需要一个不会使用的输入),然后转到std::cin输入行,这不是我想要的(我希望它立即请求输入)。
有什么原因吗?我该如何修复它?

double input;
do {
    std::cin.clear(); 
    std::cout << "Enter a double value : ";
    std::cin >> input;
    if (std::cin.fail()) {
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "Invalid input!\n";
    }   
} while (std::cin.fail());
2q5ifsrm

2q5ifsrm1#

必须添加以下行

std::cin.clear();

紧挨线的前面

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

否则,对std::cin.ignore的调用将失败,因为流处于失败状态。
但是,这将导致外部循环的循环条件不起作用。因此,整个代码应更改为:

double input;

while( true ) {
    std::cout << "Enter a double value : ";
    std::cin >> input;
    if ( std::cin.fail() ) {
        std::cin.clear();
        std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
        std::cout << "Invalid input!\n";
        continue;
    }

    //input is ok, so break out of infinite loop
    break;
}

相关问题