Spec-Zone.ru › C

strtoul, strtoull

Определено в заголовочном файле <stdlib.h>
unsigned long      strtoul( const char*          str, char**          str_end,
                            int base );
(до C99)
unsigned long      strtoul( const char* restrict str, char** restrict str_end,
                            int base );
(начиная с C99)
unsigned long long strtoull( 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 - указатель на указатель на символ; может быть установлен в позицию после последнего интерпретированного символа
base - основание системы счисления интерпретируемого целочисленного значения

Возвращаемое значение

Целочисленное значение, соответствующее содержимому str, при успешном выполнении. Если преобразованное значение выходит за диапазон соответствующего типа результата, возникает ошибка диапазона (errno устанавливается в ERANGE) и возвращается ULONG_MAX или ULLONG_MAX. Если преобразование невозможно, возвращается 0.

Пример

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    const char* p = "10 200000000000000000000000000000 30 -40 - 42";
    printf("Parsing '%s':\n", p);
    char* end = NULL;
    for (unsigned long i = strtoul(p, &end, 10);
         p != end;
         i = strtoul(p, &end, 10))
    {
        printf("'%.*s' -> ", (int)(end - p), p);
        p = end;
        if (errno == ERANGE)
        {
            errno = 0;
            printf("range error, got ");
        }
        printf("%lu\n", i);
    }
    printf("After the loop p points to '%s'\n", p);
}

Вывод:

Parsing '10 200000000000000000000000000000 30 -40 - 42':
'10' -> 10
' 200000000000000000000000000000' -> range error, got 18446744073709551615
' 30' -> 30
' -40' -> 18446744073709551576
After the loop p points to ' - 42'

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 7.24.1.7 Функции 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.6 Функция strtoul

См. также

wcstoulwcstoull
(C95)(C99)
преобразует широкую строку в значение беззнакового целого числа
(функция)
atoiatolatoll
(C99)
преобразует строку байтов в целочисленное значение
(функция)
strtolstrtoll
(C99)
преобразует строку байтов в целочисленное значение
(функция)
Документация по C++ для strtoul

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/byte/strtoul

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API