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 локали.
Если значение равно base0, основание системы счисления определяется автоматически: если префикс равен 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
(функция) |