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::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 .
Исключения
- 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 | 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)
|
преобразует байтовую строку в целое число без знака
(функция) |
|
(C++11)
(C++11)
|
преобразует байтовую строку в
std::intmax_t
или
std::uintmax_t
(функция) |
|
(C++17)
|
преобразует последовательность символов в целочисленное значение или число с плавающей запятой
(функция) |
|
(C++11)
|
преобразует байтовую строку в целочисленное значение
(функция) |
|
(C++11)
|
преобразует целочисленное значение или число с плавающей запятой в
string
(функция) |
|
(C++11)
|
преобразует целочисленное значение или число с плавающей запятой в
wstring
(функция) |