【问题标题】:loop involving "cin.fail()" running multiple times涉及“cin.fail()”多次运行的循环
【发布时间】:2021-07-11 01:37:17
【问题描述】:

以下代码有问题。这意味着一直要求输入有效,直到输入整数或双精度。它适用于字符,但是当我输入长度超过 1 的字符串时,它将多次运行循环。例如,输入“hello”导致“请输入有效数字”被打印 5 次。有趣的是,“h llo”只会打印该句子 4 次。

int gamenumber;

while(true)
{
    cin >> gamenumber;
    
    if(cin.fail())
    {
        cout << "Please enter a valid number" << endl;
        cin.clear();
        cin.ignore();
        
    } else
        break;

我确实设法通过将“cin.ignore()”替换为“cin.ignore(1000, '\n')”来解决此问题。

但无论如何,我不明白为什么单独使用“cin.ignore()”不能解决这个问题,这让我很烦恼?有没有办法在不使用“cin.ignore(1000, '\n')”的情况下修复上述代码? (这是家庭作业的一部分,可能不允许我们使用“cin.ignore(1000, '\n')”)

谢谢!

【问题讨论】:

  • 你想要std::cin.ignore (std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');吗?

标签: c++ input iostream cin


【解决方案1】:

您需要将ignore 与重载的一起使用,请参阅此分析器here

或者您可以只需要运行getlinedrain 的内容,但这种方式速度较慢且不必要。

#include <iostream>
#include <string>
 
int main()
{
    double n;
    while( std::cout << "Please, enter a number\n"
           && ! (std::cin >> n) )
    {
        std::cin.clear();
        std::string line;
        std::getline(std::cin, line);
        std::cout << "I am sorry, but '" << line << "' is not a number\n";
    }
    std::cout << "Thank you for entering the number " << n << '\n';
}

【讨论】:

  • 与其读入一个字符串(可能分配内存)然后被销毁,不如正确使用ignoreskip the rest of the line
  • @Blastfurnace 比getline好多了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 2021-01-27
相关资源
最近更新 更多