在 C++ 中,为了处理错误的输入(比如当程序要求输入一个整数但你输入一个字符时),它应该能够做一些事情然后循环重复输入。

当您在需要整数时输入字符时,我的循环会无限迭代,反之亦然:

#include<iostream>

int main()
{
    while (cout << "Enter a number" && !(cin >> num))
    {
        cin.sync();
        cin.clear();
        cout << "Invalid input; please re-enter.\n";
    }
}

我该怎么做才能让程序再次提示输入新的输入?

最佳答案

如果 cin >> num 失败,则需要从流中删除无效输入。我建议使用 ignore 而不是 sync 来完成此操作。原因是 sync 不能保证在标准库的所有实现中删除剩余的输入。

#include <iostream>
#include <limits>

int main()
{
    int num;
    while (cout << "Enter a number" && !(cin >> num))
    {
        cin.clear();    // clear the error

        // Remove input up to a new line
        cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        cout << "Invalid input; please re-enter.\n";
    }
}

上面的示例使用 std::numeric_limits<std::streamsize>::max() 来检索输入缓冲区可以容纳的最大字符数。这允许 ignore() 删除尽可能多的字符直到新行。它是惯用的 C++,比使用 magic numbers 更受欢迎,因为它可能只是隐藏了您当前遇到的问题。

这很有效,但不能处理输入在数字后包含额外字符的情况。为了处理这些情况,需要稍微更改循环以处理额外的验证。一种选择是从 cin 读取整行,将其放入 std::stringstream ,从中读取数字,然后进行额外的验证。但是,可能需要考虑一种特殊情况 - 数字后面唯一的字符是空格的行。幸运的是,标准库提供了流修饰符 std::skipws,可以轻松处理这种情况。下面的示例显示了如何轻松完成此操作
#include <iostream>
#include <sstream>

int main()
{
    int num;

    for(;;)
    {
        std::cout << "Enter a number: " << std::flush;

        std::string line;
        std::getline(std::cin, line); // Read a line from console
        std::stringstream text(line); // store in a string stream

        char ch = 0;
        if(!(text >> num).fail() && (text >> std::skipws >> ch).fail())
        {
            break;
        }

        std::cout << "Invalid input; please re-enter.\n";
    }

    return 0;
}

表达式 (text >> std::skipws >> ch).fail() 将跳过数字后出现的所有空格,然后尝试读取单个字符。如果没有可用字符,则读取将失败,表明用户只输入了一个数字而没有输入其他内容。如果我们尝试使用 cin 执行此操作,即使输入有效,它也会等待用户输入更多文本。

关于c++ - 陷入无限while循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16816823/

10-11 22:51
查看更多