почему если пользователь вводит строку типа "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';
}
→ Ссылка