Другие языки программирования и технологии

С++ Проверка на некорректный ввод значения переменной

Препод сказал, что можно сделать такую проверку. И задал на дом. Типо если у кого не получится, то он на уроке потом покажет как. Ну, а кто сделает тому оценка.

int n;
cin >> n;
cout << n;
Условие такое:
Дополнить код, на свое усмотрение, и сделать проверку на некорректный ввод. Если ввод неверный, вывести сообщение: "неверный ввод" и попросить ввести заново. Иначе - вывести введенное значение.
Ограничение: не использовать строки. Не использовать дополнительные переменные и/или константы. Не использовать массивы. Без STL.
Примеры входных данных:
Ввод: 123qwerty - вывод ошибки.
Ввод: qwerty123 - вывод ошибки.
Ввод: qwerty - вывод ошибки.
Ввод 123 - вывод 123.

Собственно вот моя наработка:
int n;
while (!(cin >> n)) {
cin.clear();
while (cin.get() != '\n');
cout << "\nневерный ввод\n";
}
cout << n << endl;

Вот что получается при вводах (из примера):
Ввод: qwerty123 - вывод ошибки.
Ввод: qwerty - вывод ошибки.
Ввод 123 - вывод 123.
Но, если ввести: 123qwerty, выводит 123, а не ошибку.

Кому не сложно помочь - помогите. Просто так. За спасибо.
Кому сложно - можете не помогать. Разрешаю не утруждаться.

Просто мне интересно как это сделать. А на оценку мне пофиг. До следующего занятия ждать тоже влом.
\ Макс /
\ Макс /
370
Ты, в принципе, в правильном направлении двигался. Просто, видимо нехватка знаний сказалась.

Вот собственно код проверки. Все как по ТЗ. Без строк, дополнительных переменных, констант, массивов, указателей, STL.

int n;
do {
cout << "Введите число: ";
if (!(cin >> n)) {
cin.clear();
while (cin.get() != '\n');
cerr << "Неверный ввод. Введите число заново. \n";
continue;
}
if (cin.peek() != '\n') {
cin.ignore(cin.rdbuf()->in_avail());
cerr << "Неверный ввод. Введите число заново. \n";
continue;
}
break;
} while (true);
cout << "Вы ввели число: " << n << endl;
Alexandr Koronkevich
Alexandr Koronkevich
2 372
Лучший ответ
Алексей Королев Красиво! Но при вводе, например, 2а, "Неверный ввод. Введите число заново. \n" выведется дважды.
\ Макс / Спасибо. Все работает.
проверил 2а, все тоже работает

rdbuf, peek это методы для работы с потоком? как и clear, ignore и get?
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
int number;
string buffer;
while (true) {
while (true) {
cout << "Input number: ";
cin >> buffer;
auto size = buffer.size();
if (size) {
auto last = size - 1;
do if (!isdigit(buffer[last])) break; while (--last);
if (last) {
cerr << "Error!\n";
continue;
}
}
try {
number = stoi(buffer);
}
catch (...) {
cerr << "Error!\n";
continue;
}
break;
}
cout << "Output number: " << number << endl;
}
}
мне кажется, он хотел, чтобы ты использовал исключения
если, конечно, не считать их частью stl
\ Макс / try throw catch?
Спасибо, что нибудь попробую придумать.
используй isdigit
пример
char str[256], *p=str;
bool isd=true;
int digit;
std::cin >> str;
while(*p)
if(!isdigit(*p++))
{
isd=false;
break;
}
if(isd)
digit=atoi(str);
else
А можно еще в цикле смотреть asci код каждого введенного символа
\ Макс / Спасибо. Попробую поэкспериментировать с isdigit.