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 locale.

Если значение base равно ​0​, числовая система счисления определяется автоматически: если префикс — 0, основание равно 8, если префикс — 0x или 0X, основание равно 16, иначе основание равно 10.

Если знак минус был частью входной последовательности, вычисленное числовое значение из последовательности цифр отрицается как при применении унарного минуса unary minus в типе результата, что применяется к правилам переполнения для беззнаковых целых чисел.

Функции устанавливают указатель, на который указывает 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:2023):
    • 7.24.1.7 The strtol, strtoll, strtoul, and strtoull functions (p: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.22.1.4 The strtol, strtoll, strtoul, and strtoull functions (p: 251-252)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.22.1.4 The strtol, strtoll, strtoul, and strtoull functions (p: 344-345)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.20.1.4 The strtol, strtoll, strtoul, and strtoull functions (p: 310-311)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 4.10.1.6 The strtoul function

См. также

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/w/c/string/byte/strtoul

Spec-Zone.ru

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