【问题标题】:User Input of Integers - Error Handling整数的用户输入 - 错误处理
【发布时间】:2010-11-19 23:27:28
【问题描述】:

我在程序的某些输入区域遇到了一些问题。有几个部分用户输入了一个特定的整数。即使他们输入了错误的也很好,但我注意到如果他们输入任何不是整数类型的东西,比如“m”,那么它会重复循环错误消息。

我有几个具有整数输入的函数。这是一个例子。

void Room::move(vector<Room>& v, int exone, int extwo, int exthree, int current)
{
    v[current].is_occupied = false;
    int room_choice;
    cout << "\nEnter room to move to: ";
    while(true)
    {
        cin >> room_choice;
        if(room_choice == exone || room_choice == extwo || room_choice == exthree)
        {
            v[room_choice].is_occupied = true;
            break;
        }
        else cout << "Incorrect entry. Try again: ";
    }
}

【问题讨论】:

  • 啊!!!为什么教授们总是布置这些愚蠢的控制台 I/O 练习?
  • 回滚 -- 答案不应张贴在问题框中。相反,您可以接受已发布的答案,和/或发布您自己的答案。

标签: c++ error-handling


【解决方案1】:

您的“已解决”代码中仍有问题。您应该在检查值之前检查失败()。 (很明显,存在 eof() 和 IO 失败的问题,而不是格式问题)。

地道读法

if (cin >> choice) {
   // read succeeded
} else if (cin.bad()) {
   // IO error
} else if (cin.eof()) {
   // EOF reached (perhaps combined with a format problem)
} else {
   // format problem
}

【讨论】:

  • 但是无论被指出多少次,人们都坚持做错了。我有点放弃了:-(
  • 感谢程序员。我会修补它。
【解决方案2】:

您可以使用cin.good()cin.fail() 来判断cin 是否可以成功处理提供的输入值。然后,如有必要,您可以使用cin.clear() 清除错误状态,然后再继续处理。

【讨论】:

  • 是的,我实际上尝试使用 cin.clear() 清除缓冲区,但这并没有改变任何东西。不过我会尝试你的其他建议。
  • 检查 cin.fail() 并使用 cin.ignore() 和 cin.clear() 修补了一些东西。谢谢。
  • cin.sync() 也可能会有所帮助...它会删除所有未读字符
【解决方案3】:

对于更简单的方法,您可以像这样使用! 运算符:

        if ( !(cin >> room_choice) )
        {
          cin.clear();
          cin.ignore();
          cout << "Incorrect entry. Try again: ";
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2013-08-08
    • 1970-01-01
    相关资源
    最近更新 更多