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;
}
Ваша функция неправильно проверяет корректность строки. Например, если вы вводили что-нибудь до этого, то в 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;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Решили добавить тесты для компилятора clang помимо gccВ итоге в одной функции получаем бесконечный цикл, и в минимальном примере размер карты...
Видел в некоторых исходниках конструкцию типа Function<DWORD>(123)Подскажите пожалуйста:
Почему данный код не определяет количество слов? С другими символами работает, а с пробелом никак не хочет