用户输入整数 - 错误处理

时间:2009-08-16 01:50:19

标签: c++ error-handling

我在程序的某些输入区域遇到了一些问题。用户输入特定整数的部分内容。即使他们输入了一个非常精细和花花公子的错误,但我注意到如果他们输入的内容不是像'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: ";
    }
}

[解决]

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 if(cin.fail())
        {
          cin.clear()
          cin.ignore()
          cout << "Incorrect entry. Try again: ";
        }
    }
}

3 个答案:

答案 0 :(得分:10)

您的“已解决”代码中仍然存在问题。您应该在检查值之前检查fail()。 (显然,与格式问题相反,存在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
}

答案 1 :(得分:6)

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

答案 2 :(得分:1)

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

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