使用时如何重置std::cin?

Posted

技术标签:

【中文标题】使用时如何重置std::cin?【英文标题】:How to reset std::cin when using it? 【发布时间】:2016-09-02 01:10:04 【问题描述】:

我对以下代码有一些问题。我在 Xcode (OS X) 中使用它。

for ( unsigned char i = 0; i < 5; i++ ) 
            
    int value;

    std::cout << ">> Enter \"value\": ";
    std::cin >> value;
    
    if ( std::cin.fail() )  std::cout << "Error: It's not integer value!\n";  else  std::cout << "The value format is ok!\n"; 
    
    std::cout << "value = " << value << std::endl;
    

这里我只是在一个循环中输入 5 个值。每次我检查错误。当我设置错误的值(“asdf”)时,std::cin 会发疯并且不再工作。看到这个:

>> Enter "value": 90
The value format is ok!
value = 90

>> Enter "value": 2343
The value format is ok!
value = 2343

>> Enter "value": 34
The value format is ok!
value = 34

>> Enter "value": asdf
Error: It's not integer value!
value = 0

>> Enter "value": Error: It's not integer value!
value = 0
80
32423
adf
3843
asdf
asdf
23423

如何输入reset std::cin?我尝试输入另一个值,但我不能,因为 std::cin 在输入错误值后似乎不再起作用。

【问题讨论】:

【参考方案1】:

当条件发生时,您可以使用std::cin.fail()

std::cin.clear();
std::cin.ignore();

然后继续循环,使用continue; 语句。 std::cin.clear() 清除错误标志并设置新标志,std::cin.ignore() 有效地忽略它们(通过提取和丢弃它们)。

来源:

    cin.ignore() cin.clear()

【讨论】:

clear 清除流的错误状态标志。它对角色没有任何作用。而ignore不带任何参数只会丢弃一个字符,这意味着如果你输入"asdf",它会循环4次,告诉你输入错误,然后再让你输入。您应该使用std::cin::ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n') 丢弃直到行尾。 @BenjaminLindley - 我对“std::cin::ignore”有疑问。我使用 CLang,它似乎应该是 std::cin.ignore 但只有一个参数... @JavaRunner:是的,没错。我打错了。但它应该接受 2 个参数。第一个用于最大字符数,第二个用于标记字符。它们都是默认值。 感谢您指出我没有意识到的@BenjaminLindley。我非常依赖文档,并没有仔细阅读它们。我的坏

以上是关于使用时如何重置std::cin?的主要内容,如果未能解决你的问题,请参考以下文章

scanf(), std::cin 在多线程环境中的行为如何?

C ++如何使用cin存储超过1个变量

std::thread 和 std::cin.get

std::cin 输入带空格?

std::cin 输入带空格?

[std :: cin在使用boost :: iostream时不可插入吗?