strtol, strtoll
Определено в заголовочном файле <stdlib.h> | ||
|---|---|---|
long strtol( const char *str, char **str_end, int base ); | (до C99) | |
long strtol( const char *restrict str, char **restrict str_end, int base ); | (с C99) | |
long long strtoll( const char *restrict str, char **restrict str_end, int base ); | (с C99) |
Интерпретирует целое значение в строке байтов, на которую указывает str.
Отбрасывает любые символы пробелов (как определяются вызовом isspace) до тех пор, пока не будет найден первый несимвол пробела, затем берёт как можно больше символов, чтобы сформировать представление целого числа в системе счисления с основанием n (где n=base) и преобразует их в целое значение. Действительное целое значение состоит из следующих частей:
- (необязательно) знак плюс или минус
- (необязательно) префикс (
0) указывающий на восьмеричную систему счисления (применяется только тогда, когда основание равно8или0) - (необязательно) префикс (
0xили0X) указывающий на шестнадцатеричную систему счисления (применяется только тогда, когда основание равно16или0) - последовательность цифр
Множество допустимых значений для основания равно {0,2,3,...,36}. Множество допустимых цифр для целых чисел в системе счисления с основанием 2 равно {0,1}, для целых чисел в системе счисления с основанием 3 равно {0,1,2}, и так далее. Для оснований, больших чем 10, допустимые цифры включают буквенные символы, начиная с Aa для целых чисел в системе счисления с основанием 11 до Zz для целых чисел в системе счисления с основанием 36. Регистр символов игнорируется.
Дополнительные числовые форматы могут быть приняты текущим установленным C локалем.
Если значение base равно 0, числовое основание определяется автоматически: если префикс равен 0, основание равно восьмеричному, если префикс равен 0x или 0X, основание равно шестнадцатеричному, в противном случае основание равно десятичному.
Если знак минус был частью входной последовательности, вычисленное числовое значение из последовательности цифр отрицается как в случае с оператором унарного минуса в типе результата.
Функции устанавливают указатель, на который указывает str_end на указатель на символ, следующий за последним интерпретируемым числовым символом. Если str_end является нулевым указателем, он игнорируется.
Если str пусто или не имеет ожидаемой формы, преобразование не выполняется, и (если str_end не является нулевым указателем) значение str сохраняется в объекте, на который указывает str_end.
Параметры
| str | - | указатель на завершаемую нулём строку байтов для интерпретации |
| str_end | - | указатель на указатель на символ. |
| base | - | основание интерпретируемого целого значения |
Возвращаемое значение
- При успешном выполнении возвращается целое значение, соответствующее содержимому
str. - Если преобразованное значение выходит за пределы диапазона соответствующего типа возвращаемого значения, возникает ошибка диапазона (устанавливая
errnoвERANGE) и возвращаетсяLONG_MAX,LONG_MIN,LLONG_MAXилиLLONG_MIN. - Если преобразование не может быть выполнено, возвращается
0.
Пример
#include <errno.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// parsing with error handling
const char *p = "10 200000000000000000000000000000 30 -40 junk";
printf("Parsing '%s':\n", p);
for (;;)
{
// errno can be set to any non-zero value by a library function call
// regardless of whether there was an error, so it needs to be cleared
// in order to check the error set by strtol
errno = 0;
char *end;
const long i = strtol(p, &end, 10);
if (p == end)
break;
const bool range_error = errno == ERANGE;
printf("Extracted '%.*s', strtol returned %ld.", (int)(end-p), p, i);
p = end;
if (range_error)
printf("\n --> Range error occurred.");
putchar('\n');
}
printf("Unextracted leftover: '%s'\n\n", p);
// parsing without error handling
printf("\"1010\" in binary --> %ld\n", strtol("1010", NULL, 2));
printf("\"12\" in octal --> %ld\n", strtol("12", NULL, 8));
printf("\"A\" in hex --> %ld\n", strtol("A", NULL, 16));
printf("\"junk\" in base-36 --> %ld\n", strtol("junk", NULL, 36));
printf("\"012\" in auto-detected base --> %ld\n", strtol("012", NULL, 0));
printf("\"0xA\" in auto-detected base --> %ld\n", strtol("0xA", NULL, 0));
printf("\"junk\" in auto-detected base --> %ld\n", strtol("junk", NULL, 0));
}Возможный вывод:
Parsing '10 200000000000000000000000000000 30 -40 junk': Extracted '10', strtol returned 10. Extracted ' 200000000000000000000000000000', strtol returned 9223372036854775807. --> Range error occurred. Extracted ' 30', strtol returned 30. Extracted ' -40', strtol returned -40. Unextracted leftover: ' junk' "1010" in binary --> 10 "12" in octal --> 10 "A" in hex --> 10 "junk" in base-36 --> 926192 "012" in auto-detected base --> 10 "0xA" in auto-detected base --> 10 "junk" in auto-detected base --> 0
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.22.1.4 Функции strtol, strtoll, strtoul и strtoull (с. 251-252)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.22.1.4 Функции strtol, strtoll, strtoul и strtoull (с. 344-345)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.20.1.4 Функции strtol, strtoll, strtoul и strtoull (с. 310-311)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.10.1.5 Функция strtol
См. также
|
(C99) | преобразует строку байтов в целое значение (функция) |
|
(C99) | преобразует строку байтов в беззнаковое целое значение (функция) |
|
(C95)(C99) | преобразует широкую строку в целое значение (функция) |
|
(C95)(C99) | преобразует широкую строку в беззнаковое целое значение (функция) |
Документация C++ для strtol, strtoll |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/byte/strtol