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 (какой внутренний механизм)?
И как другие переменные защитить от неправильного ввода одной?
Другие языки программирования и технологии
С++: и опять о переполнении при cin
Следующим переменным просто ничего не присваивается. Там остаётся значение какое было.
Когда происходит ошибка ввода, в объекте потока появляется признак ошибки. Методы для получения информации о состоянии потока:
cout << "good=" << cin.good() << " eof=" << cin.eof() << " fail=" << cin.fail() << " bad=" << cin.bad() << " rdstate=" << cin.rdstate();
Когда происходит ошибка ввода, в объекте потока появляется признак ошибки. Методы для получения информации о состоянии потока:
cout << "good=" << cin.good() << " eof=" << cin.eof() << " fail=" << cin.fail() << " bad=" << cin.bad() << " rdstate=" << cin.rdstate();
#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");
}
#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");
}
Нас опять на бабки кинули - 30 рублей.
вопрос хорош, но я нань не отвечу
Похожие вопросы
- При делении отрицательного числа выводит не правильный ответ (assembler). Если беру числа 127 13 10, пишет переполнение
- Ассемблер. При выполнении серии умножений происходит переполнение EAX.
- С++ cin cout. Не работает программа.
- C++ вопрос по cin&cout, правильное использование
- Что такое переполнение ?( Паскаль, Делфи)
- СРОЧНО! Вопрос жизни и смерти Как умножать длинные числа на паскале?! При умножение иногда выдает переполнение ячейки.
- Вопрос к программистам про переполнение буфера.
- Почему не работают операторы cin и cout в visual studio 8.Пример программы дальше
- Программисты С/С++, объясните есть ли отличия в операторах ввода/вывода (cin/cout от printf/scanf)
- Почему операторы printf, scanf работают быстрее cin cout в С++??