避免错误的用户输入(要求输入的字符串是整数)

时间:2019-03-24 22:35:27

标签: c++ string int cin cout

我有一个无限的while循环,要求用户输入数字。

我的问题很简单:如果输入是字符串,我想重新询问用户输入,输出消息“输入有效选择:”。

我进行了搜索,看起来应该检查cin.fail(),然后致电cin.clear()cin.ignore()

这是我的代码:

int main() {
    int choice;
    bool failed = false;
    while (true) {
        if (failed) cout << "Enter a valid choice: ";
        else cout << "Enter a number: ";
        cin >> choice;

        if (cin.fail()) {
            cin.clear();
            cin.ignore();
            failed = true;
        }
    }

    return 0;
}

但是,这并不能真正解决我的问题。当然,它不是无限打印的,但是对于每个字母多余的字母,它将打印另一个"Enter a valid choice:"

似乎每个额外的字母我都需要打电话给cin.ignore()

还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

您有一个无限循环,因为即使输入有效输入也不会中断循环。那是你真正想要的吗?如果是这样,至少您不会在有效输入中重置),标志。

更重要的是,当输入无效输入时,您不会忽略输入的所有内容,而一次只忽略1个字符。这就是为什么您会看到其他提示的原因。

尝试以下方法:

= VALUES(

答案 1 :(得分:0)

之所以打印多次,是因为您仅清除cin的状态,而没有清除输入缓冲区。您可以通过多种方式进行操作:-

  1. 使用fflush(stdin)清除输入缓冲区。这是C方法,可以通过包含cstdio标头来完成。

  2. 使用cin.ignore忽略当前输入流中的所有字符。您可以通过将忽略单个字符的行cin.ignore()替换为忽略整个行的代码cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')来做到这一点。为此,您需要限制标头。

  3. 最后,您可以使用一个简单的循环(如while (cin.get() != '\n'){continue;})执行同样的操作,该循环将忽略所有字符,直到换行为止。

解决同一问题的另一种方法是采用字符串形式的输入,并使用strtol()isdigit()函数检查输入是否有效。

顺便说一下,无限循环是因为您没有使用break语句来终止循环。因此,您可以通过添加

来避免这种情况
if(!failed)
   break;

此外,您还需要通过添加

来更改每个循环条目中“失败”的状态
failed=false;

在循环主体的开头。