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), соответственно.
std::strtol(str.c_str(), &ptr, base).std::wcstol(str.c_str(), &ptr, base).std::strtol(str.c_str(), &ptr, base).std::wcstol(str.c_str(), &ptr, base).std::strtoll(str.c_str(), &ptr, base).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 | будет выброшено |
См. также
|
(C++11)(C++11) | преобразует строку в беззнаковое целое число (функция) |
|
(C++11)(C++11)(C++11) | преобразует строку в число с плавающей точкой (функция) |
|
(C++11) | преобразует байтовую строку в целочисленное значение (функция) |
|
(C++11) | преобразует байтовую строку в беззнаковое целочисленное значение (функция) |
|
(C++11)(C++11) | преобразует байтовую строку в std::intmax_t или std::uintmax_t (функция) |
|
(C++17) | преобразует последовательность символов в целое число или число с плавающей точкой (функция) |
|
(C++11) | преобразует байтовую строку в целочисленное значение (функция) |
|
(C++11) | преобразует целочисленное значение или число с плавающей точкой в string (функция) |
|
(C++11) | преобразует целочисленное значение или число с плавающей точкой в wstring (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/basic_string/stol