Namespaces
Variants

strtol, strtoll

С ru.cppreference.net
 
 
 
Строки байтов, завершающиеся нулём
Функции
Манипуляции с символами
Преобразования в числовые форматы и обратно
Манипуляции со строками
Проверка строк
Манипуляции с памятью
Разное
 
Определено в заголовочном файле <stdlib.h>
long      strtol( const char*          str, char**          str_end, int base );
(1) (до 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 );
(2) (начиная с C99)

Интерпретирует целочисленное значение в строке байтов, на которую указывает str.

Пропускает любые пробельные символы (как определено вызовом isspace) до тех пор, пока не будет найден первый непробельный символ, затем считывает максимально возможное количество символов для формирования корректного base-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 - 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

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.24.1.7 Функции strtol, strtoll, strtoul и strtoull (стр. 362-363)
  • Стандарт 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

Смотрите также

преобразует строку байтов в целочисленное значение
(функция)
преобразует строку байтов в беззнаковое целочисленное значение
(функция)
(C95)(C99)
преобразует широкую строку в целочисленное значение
(функция)
преобразует широкую строку в беззнаковое целочисленное значение
(функция)
Документация C++ для strtol, strtoll