避免错误的用户输入(当问的是一个整数时字符串)

问题描述 投票:1回答:2

我有一个无限的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()

这样做的其他任何方式?

c++ string int cin cout
2个回答
1
投票

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

更重要的是,当输入无效输入时,您不会忽略所有被输入的内容,您一次只能忽略1个字符。这就是为什么你会看到额外的提示。

试试这个:

int main() {
    int choice;
    while (true) {
        cout << "Enter a number: ";
        while (!(cin >> choice)) {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "Enter a valid choice: ";
        }
    }
    return 0;
}

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;

在循环体的开始。

© www.soinside.com 2019 - 2024. All rights reserved.