Spec-Zone.ru › C++

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

Определено в заголовке <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.

Исключения

  • std::invalid_argument если преобразование не удалось.
  • std::out_of_range если преобразованное значение выйдет за пределы диапазона типа результата или если подлежащая функция (std::strtol или std::strtoll) установит errno в ERANGE.

Пример

#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 Применено к Поведение, как опубликовано Корректное поведение
LWG 2009 C++11 std::out_of_range не будет выброшено, если
std::strtol или std::strtoll установит errno в ERANGE
будет выброшено

См. также

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

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

Spec-Zone.ru

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