Spec-Zone.ru › C++

std::strtol, std::strtoll

Определено в заголовке <cstdlib>
long      strtol( const char* str, char** str_end, int base );
(1)
long long strtoll( const char* str, char** str_end, int base );
(2) (с C++11)

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

Игнорирует все символы пробела (как определено вызовом std::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, основание — восьмеричное; если префикс 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 <cerrno>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <string>
 
int main()
{
    const char* p = "10 200000000000000000000000000000 30 -40";
    std::cout << "Parsing " << std::quoted(p) << ":\n";
 
    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* p_end{};
        const long i = std::strtol(p, &p_end, 10);
        if (p == p_end)
            break;
 
        const bool range_error = errno == ERANGE;
        const std::string extracted(p, p_end - p);
        p = p_end;
 
        std::cout << "Extracted " << std::quoted(extracted)
                  << ", strtol returned " << i << '.';
        if (range_error)
            std::cout << "\n  Range error occurred.";
 
        std::cout << '\n';
    }
}

Возможный вывод:

Parsing "10 200000000000000000000000000000 30 -40":
Extracted "10", strtol returned 10.
Extracted " 200000000000000000000000000000", strtol returned 9223372036854775807.
  Range error occurred.
Extracted " 30", strtol returned 30.
Extracted " -40", strtol returned -40.

См. также

stoistolstoll
(C++11)(C++11)(C++11)
преобразует строку в целое со знаком
(функция)
strtoulstrtoull
(C++11)
преобразует строку байтов в целое без знака
(функция)
strtoimaxstrtoumax
(C++11)(C++11)
преобразует строку байтов в std::intmax_t или std::uintmax_t
(функция)
wcstolwcstoll
преобразует широкую строку в целое значение
(функция)
strtofstrtodstrtold
преобразует строку байтов в число с плавающей запятой
(функция)
from_chars
(C++17)
преобразует последовательность символов в целое или число с плавающей запятой
(функция)
atoiatolatoll
(C++11)
преобразует строку байтов в целое значение
(функция)
C документация для strtol, strtoll

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

Spec-Zone.ru

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