Namespaces
Variants

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

From 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 ) до первого непробельного символа, затем принимает максимально возможное количество символов, формирующих корректное base-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
(функция)