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

С++: и опять о переполнении при cin

C++, использую VS:

short a,b,c,d;

std::cin>>a>>b>>c>>d;

если одной из переменной юзер ошибочно переполнение, к примеру, для a 33333, то все последующие переменные (b,c,d) сразу принимают одно и то же значение -13108( а если с unsigned это провернуть, то 52428)

Если судить по переводу из интернета, то эти числа (-13108, 52428 и т. д.) содержатся в неприсвоенных переменных в debug mode, и, если cin фейлится, то эти числа присваиваются переменным. Так?

НО не найду ответа почему это внезапное присваивание происходит не с "виновной" переменной, а с другими переменными, почему у них не срабатывает cin (какой внутренний механизм)?

И как другие переменные защитить от неправильного ввода одной?
Следующим переменным просто ничего не присваивается. Там остаётся значение какое было.
Когда происходит ошибка ввода, в объекте потока появляется признак ошибки. Методы для получения информации о состоянии потока:

cout << "good=" << cin.good() << " eof=" << cin.eof() << " fail=" << cin.fail() << " bad=" << cin.bad() << " rdstate=" << cin.rdstate();
Роман Юрьев
Роман Юрьев
58 065
Лучший ответ
#include <iostream>
#include <string>
#include <limits>
using namespace std;
template<typename Type>
Type integer(const char* msg = ">>> ") {
string line;
long long value;
bool flag;
do {
flag = false;
cout << msg;
cin >> line;
try {
value = stoll(line);
} catch (const exception& e) {
cerr << "Error: " << e.what() << "\nType: " << typeid(e).name() << '\n';
cin.ignore(numeric_limits<streamsize>::max(), '\n');
flag = true;
continue;
}
if (value < numeric_limits<Type>::min()) {
cout << "Error: value is less than acceptable!\n";
flag = true;
} else if (value > numeric_limits<Type>::max()) {
cout << "Error: value is more than acceptable!\n";
flag = true;
}
} while (flag);
return static_cast<Type>(value);
}
int main() {
short a = integer<short>();
short b = integer<short>();
short c = integer<short>();
short d = integer<short>();
system("cls");
cout
<< "a: " << a << '\n'
<< "b: " << b << '\n'
<< "c: " << c << '\n'
<< "d: " << d << '\n'
<< endl;
system("pause");
}
РБ
Руслан Буров
85 000
Нас опять на бабки кинули - 30 рублей.
Adilet Keneshov
Adilet Keneshov
925
вопрос хорош, но я нань не отвечу