所以,我正在研究的这个程序并没有像我想要的那样处理不正确的用户输入。用户应该只能输入一个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');
}
}
任何想法都将不胜感激。提前谢谢。
答案 0 :(得分:2)
读取整数并测试它是否在所需范围内:
int n;
if (!(std::cin >> n && n >= 100 && n < 1000))
{
/* input error! */
}
答案 1 :(得分:0)
虽然Kerrek SB提供了解决问题的方法,但只是解释一下你的方法出了什么问题:整数数组可以成功读取。溪流状况良好,但你没有到达空间。也就是说,要使用你的方法,你还需要测试最后一个数字后面的字符,即流中的下一个字符,是某种空格:
if (std::isspace(std::cin.peek())) {
// deal with funny input
}
但是,第一个值的错误恢复似乎并不完全正确。您可能还希望ignore()
所有字符直到行尾。