Ответ 1
Простым ответом является использование strtoul()
.
Более длинный ответ заключается в том, что даже если все, что вам нужно, было подписано 32-битными целыми числами или были довольны 31 битом для unsigned, функция atoi()
плохо подходит для того, что вы, кажется, делаете.
Как вы уже отметили, функция atoi()
преобразует строку в целое число. Нормальное целое число со знаком. Однако то, что atoi()
не делает, это обработка ошибок. Спецификация atoi()
говорит: " Если значение не может быть представлено, поведение не определено ".
Семейство функций strto *() четко определяет, как обрабатываются ошибки, поэтому во всех случаях вы должны заменить atoi()
на вызовы strtol()
(преобразовать строку в long), и в этом случае, поскольку вы хотите обрабатывать целые числа без знака, вы должны использовать strtoul()
(преобразовать строку в unsigned long).
Также обратите внимание, что если вы хотите обрабатывать большие числа, существуют функции strtoll()
и strtoull()
, чтобы преобразовать вашу строку в длинный или беззнаковый длинный. (И если вы просто хотите обрабатывать максимально возможные интегральные значения, не беспокоясь обо всем этом, между ними есть strtoimax()
и strtoumax()
, которые возвращают значения типа intmax_t
или uintmax_t
соответственно.)
Документация POSIX: