Namespaces
Variants

strtol, strtoll

From cppreference.net
< c ‎ | string ‎ | byte
Определено в заголовочном файле <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 ) до первого непробельного символа, затем принимает максимально возможное количество символов, формирующих корректное 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)
{
    // разбор с обработкой ошибок
    const char* p = "10 200000000000000000000000000000 30 -40 junk";
    printf("Parsing '%s':\n", p);
    for (;;)
    {
        // errno может быть установлен в любое ненулевое значение вызовом библиотечной функции
        // независимо от наличия ошибки, поэтому его нужно сбросить
        // для проверки ошибки, установленной 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 --> Произошла ошибка диапазона.");
        putchar('\n');
    }
    printf("Unextracted leftover: '%s'\n\n", p);
    // разбор без обработки ошибок
    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.
 --> Произошла ошибка диапазона.
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.22.1.4 Функции strtol, strtoll, strtoul и strtoull (стр: TBD)
  • Стандарт 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)
преобразует широкую строку в целочисленное значение
(функция)
(C95) (C99)
преобразует широкую строку в беззнаковое целочисленное значение
(функция)
C++ documentation для strtol , strtoll