0

所以,我正在开发的这个程序并没有按照我想要的方式处理不正确的用户输入。用户应该只能输入一个 3 位数字,以便稍后在 HotelRoom 对象构造函数中使用。不幸的是,我的导师不允许在他的课堂上使用字符串对象(否则,我认为我不会有任何问题)。另外,我将 roomNumBuffer 传递给构造函数以创建一个 const char 指针。我目前正在使用 iostream、iomanip、string.h 和限制预处理器指令。尝试为 roomNumBuffer 输入太多字符后会出现此问题。以下屏幕截图显示了发生的情况: 在此处输入图像描述

此问题的相关代码如下:

cout << endl << "Please enter the 3-digit room number: ";
do {        //loop to check user input
    badInput = false;
    cin.width(4);
    cin >> roomNumBuffer;
    for(int x = 0; x < 3; x++) {
        if(!isdigit(roomNumBuffer[x])) {        //check all chars entered are digits
            badInput = true;
        }
    }
    if(badInput) {
        cout << endl << "You did not enter a valid room number. Please try again: ";
    }
    cin.get();      //Trying to dum- any extra chars the user might enter
} while(badInput);

for(;;) {   //Infinite loop broken when correct input obtained
    cin.get();      //Same as above
    cout << "Please enter the room capacity: ";
    if(cin >> roomCap) {
        break;
    } else {
        cout << "Please enter a valid integer" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}
for(;;) {   //Infinite loop broken when correct input obtained
    cout << "Please enter the nightly room rate: ";
    if(cin >> roomRt) {
        break;
    } else {
        cout << "Please enter a valid rate" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}

任何想法将不胜感激。提前致谢。

4

2 回答 2

2

读取一个整数并测试它是否在所需的范围内:

int n;

if (!(std::cin >> n && n >= 100 && n < 1000))
{
    /* input error! */
}
于 2012-11-20T23:25:10.133 回答
0

尽管 Kerrek SB 提供了一种解决问题的方法,但只是为了解释您的方法出现问题时的原因:可以成功读取整数数组。溪流状态良好,但您没有到达空间。也就是说,要使用您的方法,您还需要测试最后一个数字之后的字符,即流中的下一个字符,是某种空格:

if (std::isspace(std::cin.peek())) {
     // deal with funny input
}

不过,第一个值的错误恢复似乎不太正确。您可能还希望ignore()所有字符直到行尾。

于 2012-11-20T23:37:11.890 回答