почему если пользователь вводит строку типа "4апвап" цифра сохраняется, а буквы отбрасываются и как этого избежать?
необходимо, чтобы вводилось только целое число
код
int* getMyArr(const short myArrSize, int* myArr) {
for (short i = 0; i <= myArrSize; i++) {
std::cout << 'a' << i + 1 << " ";
std::cin >> myArr[i];
if (std::cin.fail()) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
i--;
std::cout << "Введено некорректное значение, повторите попытку" << std::endl;
continue;
}
}
return myArr;
}
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Чтобы не возится с остатками ввода после ошибок, вводится целиком строка, которая затем разбираетcя через std::istringstream
.
#include <iostream>
#include <sstream>
#include <string>
bool read_int(std::istream &is, int &i) {
std::string s;
std::getline(is, s);
std::istringstream iss(s);
int v;
if (!(iss >> v)) {
return false;
}
char c;
while (iss.get(c)) {
if (!std::isspace((unsigned char) c)) {
return false;
}
}
i = v;
return true;
}
int read_int(const char *prompt) {
while (std::cin) {
std::cout << prompt;
int v;
if (read_int(std::cin, v)) {
return v;
}
std::cout << "Ошибка. Повторите ещё раз.\n";
}
throw std::runtime_error("std::cin поломался");
}
int main() {
int i = read_int("Введите целое: ");
std::cout << "Введено " << i << '\n';
}