Top.Mail.Ru
Ответы

Ошибка в С++, как решить?

Failed test #5 of 21. Runtime error

Error:
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
Aborted (core dumped)

По дате
По рейтингу
Аватар пользователя
Мудрец

Как я понимаю, Вы уже дошли до парсинга IP-адреса.

✓ Понимаю, что Вы могли видеть решение на Pastebin, но я давно осознал, что сам решил эту задачу неоптимально. Поэтому, извините, если Вы уже ознакомились с моим решением.

Решать следует в таком порядке:

1. Предварительная подготовка. Используйте манипулятор ws перед тем, как ввести строку. Можно даже совместить с вызовом функции getline.

getline (cin >> ws, s);

2. Непосредственно ввод строки, но это указано выше: тот самый вызов getline.

3. Проверка длины строки: если длина меньше 7 или больше 15, то строка НЕ является IP-адресом. Не пропускайте этот пункт!

4. Конкатенация введённой строки с точкой: Вы и сами догадались это сделать, только не нужно добавлять точку в начале строки. Добавить точку в конец строки проще с помощью операции “ + ”.

s = s + ".";

5. Цикл из 4 итераций, здесь смотрите внимательно!

5.1. Проверяете первый символ — он должен быть цифрой, если нет, то строка НЕ является IP-адресом.
5.2. Только на этом этапе Вы можете использовать функцию stoi; обязательно добавьте ещё один параметр — целочисленную переменную, в ней будет позиция в строке, где встретился символ-разделитель. ✓ Если Вы выполнили пункт 5.1., то в пункте 5.2. ошибок не возникнет!
5.3. Сразу можете проверить распознанное число и символ-разделитель: число должно быть в пределах [0; 255], а разделителем должна быть точка. Если это не так, то НЕ IP-адрес!
5.4. Уделяете подстроку от начала до точки и саму точку. Возврат к пункту 5.1. Важно, чтобы первый символ после точки был цифрой!

6. Проверка конца строки: здесь Вы уже вышли из цикла, но закончилась ли строка? Если в строке не осталось больше символов (проверяется с помощью s.empty()), то радуйтесь — строка ЯВЛЯЕТСЯ IP-адресом! Иначе, строка НЕ является IP-адресом. Конец.

✓ Ещё один совет: всё, что у Вас внутри main, переоформите как собственную функцию (придумайте ей имя). Пусть функция возвращает значение типа bool. В таком случае Вы сможете просто выходить из этой функции по return false; . А в пункте 6. просто пишете return s.empty();
А ниже собственной функции просто пишете заголовок функции main, все объявления и вызов собственной функции. Вывод Yes или No тоже будет в main.

ТОЛЬКО ТАК.