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 локаль может допускать дополнительные числовые форматы.

Если значение base равно 0, основание системы счисления определяется автоматически: если префикс — 0, основание восьмеричное; если префикс — 0x или 0X, основание шестнадцатеричное; в противном случае основание десятичное.

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

Функция устанавливает указатель, на который указывает str_end, так, чтобы он указывал на символ, следующий за последним обработанным символом. Если str_end — нулевой указатель, он игнорируется.

Если str пуста или имеет неверный формат, преобразование не выполняется, а значение str сохраняется в объекте, на который указывает str_end (если 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/cpp/string/byte/strtol

Spec-Zone.ru

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