Ответ 1
какая функция будет лучше всего преобразовать десятичное, шестнадцатеричное или восьмеричное число в целое число (?)
Чтобы преобразовать такой текст в int
, рекомендуем long strtol(const char *nptr, char **endptr, int base);
с дополнительными тестами при конвертации в int
, если это необходимо.
Используйте 0
в качестве base
для оценки ранних символов в преобразовании рулевого управления как базы 10, 16 или 8. @Mike Holt
0x or 0X followed by hex digits--> hexadecimal
0 --> octal
else --> decimal
Образец кода
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
int mystrtoi(const char *str) {
char *endptr;
errno = 0;
// v--- determine conversion base
long long_var = strtol(str, &endptr, 0);
// out of range , extra junk at end, no conversion at all
if (errno == ERANGE || *endptr != '\0' || str == endptr) {
Handle_Error();
}
// Needed when 'int' and 'long' have different ranges
#if LONG_MIN < INT_MIN || LONG_MAX > INT_MAX
if (long_var < INT_MIN || long_var > INT_MAX) {
errno = ERANGE;
Handle_Error();
}
#endif
return (int) long_var;
}
Атой против Атол против Стрэтол против Стрэтул против Скэнф
atoi()
Pro: Очень просто.
Pro: конвертировать в int
.
Pro: В стандартной библиотеке C
Pro: быстро.
Con: нет обработки ошибок.
Con: не обрабатывать ни шестнадцатеричное, ни восьмеричное.
atol()
Pro: просто.
Pro: В стандартной библиотеке C
Pro: быстро.
Con: Конвертирует в long
, не int
который может отличаться по размеру.
Con: нет обработки ошибок.
Con: не обрабатывать ни шестнадцатеричное, ни восьмеричное.
strtol()
Pro: просто.
Pro: В стандартной библиотеке C
Pro: Хорошая обработка ошибок.
Pro: быстро.
Pro: Может обрабатывать двоичные файлы.
Con: Конвертировать в long
, а не int
который может отличаться по размеру.
strtoul()
Pro: просто.
Pro: В стандартной библиотеке C
Pro: Хорошая обработка ошибок.
Pro: быстро.
Pro: Может обрабатывать двоичные файлы.
---: появляется, чтобы не жаловаться на отрицательные числа.
Con: конвертирует в unsigned long
, не int
который может отличаться по размеру.
sscanf(..., "%i",...)
Pro: В стандартной библиотеке C
Pro: конвертирует в int
.
---: средняя сложность.
Против: Потенциально медленно.
Con: ОК, обработка ошибок (переполнение не определено).
Все страдают/выигрывают от настроек locale
. §7.22.1.4 6 "В отличие от локали" C "могут приниматься дополнительные формы предметной последовательности, специфичные для локали".
Дополнительные кредиты:
@Jonathan Leffler: errno
тест на ERANGE
, atoi()
только для десятичных чисел, обсуждение errno
-многопоточности.
@Marian Скорость выпуска.
@Kevin Библиотека инклюзивности.
Для преобразования short
, signed char
и т.д. Рассмотрим strto_subrange()
.