Не правильно обрабатывает ввод пользователя

Итак, эта программа, над которой я работаю, не обрабатывает неправильный ввод пользователя так, как я хочу. Пользователь должен иметь возможность только ввести трехзначный номер для последующего использования в конструкторе объекта HotelRoom. К сожалению, мой инструктор не разрешает использование строковых объектов в своем классе (иначе, я думаю, у меня не было бы проблем). Кроме того, я передаю roomNumBuffer конструктору для создания константного указателя на символ. В настоящее время я использую 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

Решение

Прочитайте целое число и проверьте, находится ли оно в желаемом диапазоне:

int n;

if (!(std::cin >> n && n >= 100 && n < 1000))
{
/* input error! */
}
2

Другие решения

Несмотря на то, что Kerrek SB предлагает подход к решению проблемы, просто объясните, что не так с вашим подходом: целочисленный массив может быть успешно прочитан. Поток был в хорошем состоянии, но вы не достигли места. То есть, чтобы использовать ваш подход, вам также необходимо проверить, что символ, следующий за последней цифрой, то есть следующий символ в потоке, является пробелом некоторого вида:

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

Кажется, что исправление ошибок для первого значения не совсем верно. Вы, вероятно, также хотите ignore() все символы до конца строки.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector