У вас есть 3 варианта:
atoi
Это, вероятно, самый быстрый способ, если вы используете его в коде, критичном к производительности, но он не сообщает об ошибках Если строка не начинается с целого числа, она вернет 0. Если строка содержит мусор после целого числа, она преобразует начальную часть и игнорирует остальные. Если число слишком велико, чтобы поместиться в int
, поведение не определено.
sscanf
Некоторые отчеты об ошибках, и вы можете гибко выбирать тип хранилища (подписанные / неподписанные версии char/short/int/long/long long/size_t/ptrdiff_t/intmax_t
).
Возвращаемое значение - количество успешных преобразований, поэтому сканирование на "%d"
вернет 0, если строка не начинается с целого числа. Вы можете использовать "%d%n"
, чтобы сохранить индекс первого символа после целого числа, прочитанного в другой переменной, и, таким образом, проверить, была ли преобразована вся строка или есть мусор после этого. Однако, как и atoi
, поведение при целочисленном переполнении не определено.
strtol
и семья
Надежные отчеты об ошибках, при условии, что вы установили errno
в 0 до совершения вызова. Возвращаемые значения указываются при переполнении и будут установлены errno
. Вы можете выбрать любое число от 2 до 36 или указать 0 в качестве основания, чтобы автоматически интерпретировать ведущие 0x
и 0
как шестнадцатеричные и восьмеричные соответственно. Выбор типа для преобразования является подписанной / неподписанной версией long/long long/intmax_t
.
Если вам нужен меньший тип, вы всегда можете сохранить результат во временной переменной long
или unsigned long
и проверить на переполнение самостоятельно.
Поскольку эти функции принимают указатель на аргумент указателя, вы также получаете указатель на первый символ, следующий за преобразованным целым числом, бесплатно, так что вы можете сказать, была ли целая строка целым числом, или при необходимости проанализировать последующие данные в строке .
Лично я бы порекомендовал семью strtol
для большинства целей. Если вы делаете что-то быстро и грязно, atoi может удовлетворить ваши потребности.
Кроме того, иногда я нахожу, что мне нужно разобрать числа, где начальные пробелы, знаки и т. Д. Не должны быть приняты. В этом случае чертовски легко накатить свой цикл for, например,
for (x=0; (unsigned)*s-'0'<10; s++)
x=10*x+(*s-'0');
Или вы можете использовать (для надежности):
if (isdigit(*s))
x=strtol(s, &s, 10);
else /* error */