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;
}
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости