Namespaces
Variants

std::stoi, std::stol, std::stoll

На сайте ru.cppreference.net
 
 
 
std::basic_string
 
Определено в заголовочном файле <string>
int       stoi ( const std::string& str,
                 std::size_t* pos = nullptr, int base = 10 );
(1) (начиная с C++11)
int       stoi ( const std::wstring& str,
                 std::size_t* pos = nullptr, int base = 10 );
(2) (начиная с C++11)
long      stol ( const std::string& str,
                 std::size_t* pos = nullptr, int base = 10 );
(3) (начиная с C++11)
long      stol ( const std::wstring& str,
                 std::size_t* pos = nullptr, int base = 10 );
(4) (начиная с C++11)
long long stoll( const std::string& str,
                 std::size_t* pos = nullptr, int base = 10 );
(5) (начиная с C++11)
long long stoll( const std::wstring& str,
                 std::size_t* pos = nullptr, int base = 10 );
(6) (начиная с C++11)

Интерпретирует целое число со знаком в строке str.

Пусть ptr будет внутренним (для функций преобразования) указателем типа char* (1,3,5) или wchar_t* (2,4,6), соответственно.

1) Вызывает std::strtol(str.c_str(), &ptr, base).
2) Вызывает std::wcstol(str.c_str(), &ptr, base).
3) Вызывает std::strtol(str.c_str(), &ptr, base).
4) Вызывает std::wcstol(str.c_str(), &ptr, base).
5) Вызывает std::strtoll(str.c_str(), &ptr, base).
6) Вызывает std::wcstoll(str.c_str(), &ptr, base).

Отбрасывает любые пробельные символы (определяемые вызовом 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, основание шестнадцатеричное, в противном случае основание десятичное.

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

Если pos не является нулевым указателем, то ptr получит адрес первого непреобразованного символа в str.c_str(), а индекс этого символа будет вычислен и сохранён в *pos, что даёт количество символов, обработанных при преобразовании.

Параметры

str - строка для преобразования
pos - адрес целого числа для хранения количества обработанных символов
base - система счисления

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

Целочисленное значение, соответствующее содержимому str .

Исключения

Пример

#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <string>
#include <utility>
int main()
{
    const auto data =
    {
        "45",
        "+45",
        " -45",
        "3.14159",
        "31337 with words",
        "words and 2",
        "12345678901",
    };
    for (const std::string s : data)
    {
        std::size_t pos{};
        try
        {
            std::cout << "std::stoi(" << std::quoted(s) << "): ";
            const int i{std::stoi(s, &pos)};
            std::cout << i << "; pos: " << pos << '\n';
        }
        catch (std::invalid_argument const& ex)
        {
            std::cout << "std::invalid_argument::what(): " << ex.what() << '\n';
        }
        catch (std::out_of_range const& ex)
        {
            std::cout << "std::out_of_range::what(): " << ex.what() << '\n';
            const long long ll{std::stoll(s, &pos)};
            std::cout << "std::stoll(" << std::quoted(s) << "): " << ll
                      << "; pos: " << pos << '\n';
        }
    }
    std::cout << "\nCalling with different radixes:\n";
    for (const auto& [s, base] : {std::pair<const char*, int>
        {"11",  2}, {"22",  3}, {"33",  4}, {"77",  8},
        {"99", 10}, {"FF", 16}, {"jJ", 20}, {"Zz", 36}})
    {
        const int i{std::stoi(s, nullptr, base)};
        std::cout << "std::stoi(" << std::quoted(s)
                  << ", nullptr, " << base << "): " << i << '\n';
    }
}

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

std::stoi("45"): 45; pos: 2
std::stoi("+45"): 45; pos: 3
std::stoi(" -45"): -45; pos: 4
std::stoi("3.14159"): 3; pos: 1
std::stoi("31337 with words"): 31337; pos: 5
std::stoi("words and 2"): std::invalid_argument::what(): stoi
std::stoi("12345678901"): std::out_of_range::what(): stoi
std::stoll("12345678901"): 12345678901; pos: 11
Calling with different radixes:
std::stoi("11", nullptr, 2): 3
std::stoi("22", nullptr, 3): 8
std::stoi("33", nullptr, 4): 15
std::stoi("77", nullptr, 8): 63
std::stoi("99", nullptr, 10): 99
std::stoi("FF", nullptr, 16): 255
std::stoi("jJ", nullptr, 20): 399
std::stoi("Zz", nullptr, 36): 1295

Отчеты о дефектах

Следующие отчеты о дефектах, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2009 C++11 std::out_of_range не выбрасывалось бы, если
std::strtol или std::strtoll устанавливают errno в ERANGE
будет выбрасываться

Смотрите также

(C++11) (C++11)
преобразует строку в целое число без знака
(функция)
(C++11) (C++11) (C++11)
преобразует строку в число с плавающей запятой
(функция)
преобразует байтовую строку в целочисленное значение
(функция)
преобразует байтовую строку в целое число без знака
(функция)
(C++11) (C++11)
преобразует байтовую строку в std::intmax_t или std::uintmax_t
(функция)
(C++17)
преобразует последовательность символов в целочисленное значение или число с плавающей запятой
(функция)
преобразует байтовую строку в целочисленное значение
(функция)
(C++11)
преобразует целочисленное значение или число с плавающей запятой в string
(функция)
(C++11)
преобразует целочисленное значение или число с плавающей запятой в wstring
(функция)