Почему stoi выдает ошибку invalid_argument?

124
11 мая 2019, 21:50
string side;
int rows;
while (true)
{
    getline(cin, side);
    if (sideIsValid(side)) break;
}
rows = stoi(side);

Вот фрагмент кода одной из функций. При первом вызове все проходит на ура. Но при втором stoi дает invalid_argument, причём через getline ещё не было передано новое значение для side. sideIsValid() выглядит так:

bool sideIsValid(string side)
{
    for (int i = 0; i < side.length(); i++)
    {
        if ((side[i] >= 48 && side[i] <= 57) || side[i] == '.' || side[0] == '-')
        {
        continue;
        }
        else return 0;
    }
    return 1;
}
Answer 1

Ваша функция неправильно проверяет корректность строки. Например, если вы вводили что-нибудь до этого, то в cin остался символ '\n', getline читает до этого символа и получается пустая строка, что ваша функция считает валидным значение, но для stoi оно таким не является. Примеры ошибочных строк, которые ваша функция посчитает корректным: "", ".", ".5", "-.", "-.5".

Цикл до ввода корректного числа можно сделать так:

int rows;
while (true) {
    cin >> rows;
    if (cin.fail()) {
        cin.clear(); // unset failbit
        cin.ignore(INT_MAX, '\n');
        //cout << "Error" << endl;
    }
    else {
        cin.ignore(INT_MAX, '\n');
        break;
    }
}
READ ALSO
Бесконечный цикл в clang, в gcc - работает

Бесконечный цикл в clang, в gcc - работает

Решили добавить тесты для компилятора clang помимо gccВ итоге в одной функции получаем бесконечный цикл, и в минимальном примере размер карты...

145
Передать любой тип как аргумент (с указанием типа) в C++

Передать любой тип как аргумент (с указанием типа) в C++

Видел в некоторых исходниках конструкцию типа Function<DWORD>(123)Подскажите пожалуйста:

153
Посчитать количество слов в строке

Посчитать количество слов в строке

Почему данный код не определяет количество слов? С другими символами работает, а с пробелом никак не хочет

144