Проверяем числовой аргумент командной строки в C++!
Допустим, утилита принимает номер порта. Преобразовать строку в число мало, нужно отклонить пустой ввод, лишние символы и значение вне допустимого диапазона. Иначе строка вроде 8080abc может превратиться в 8080.
Возьмём строку из аргументов программы и подготовим границы для разбора:
std::string_view input = argv[1];
const char* first = input.data();
const char* last = first + input.size();
Перед чтением argv[1] проверь, что argc равен 2. Пустую строку тоже лучше сразу отклонить, чтобы сообщение об ошибке было понятным.
Теперь вызовем std::from_chars. Он не создаёт временную строку и сообщает результат через код ошибки:
int port = 0;
auto [next, error] = std::from_chars(first, last, port);
Одного успешного преобразования недостаточно. Проверим, что функция действительно дошла до конца входа:
if (error != std::errc{} || next != last) {
std::cerr 65535) {
std::cerr
Допустим, утилита принимает номер порта. Преобразовать строку в число мало, нужно отклонить пустой ввод, лишние символы и значение вне допустимого диапазона. Иначе строка вроде 8080abc может превратиться в 8080.
Возьмём строку из аргументов программы и подготовим границы для разбора:
std::string_view input = argv[1];
const char* first = input.data();
const char* last = first + input.size();
Перед чтением argv[1] проверь, что argc равен 2. Пустую строку тоже лучше сразу отклонить, чтобы сообщение об ошибке было понятным.
Теперь вызовем std::from_chars. Он не создаёт временную строку и сообщает результат через код ошибки:
int port = 0;
auto [next, error] = std::from_chars(first, last, port);
Одного успешного преобразования недостаточно. Проверим, что функция действительно дошла до конца входа:
if (error != std::errc{} || next != last) {
std::cerr 65535) {
std::cerr