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 の場合)整数数値表現を形成するために可能な限りの文字を取得し、それらを整数値に変換します。有効な整数値は以下の部分で構成されます:

  • (オプション) プラスまたはマイナス記号
  • (オプション) 8進数を示す接頭辞 ( 0 ) (基数が 8 または 0 の場合のみ適用)
  • (オプション) 16進数を示す接頭辞 ( 0x または 0X ) (基数が 16 または 0 の場合のみ適用)
  • 数字のシーケンス

基数として有効な値の集合は {0, 2, 3, ..., 36} です。基数 2 の整数で有効な数字の集合は {0, 1} 、基数 3 の整数では {0, 1, 2} となります。これ以降も同様です。 10 より大きい基数の場合、有効な数字には英字が含まれ、基数 11 の整数では Aa から始まり、基数 36 の整数では Zz までとなります。文字の大文字・小文字は区別されません。

現在インストールされているC locale によって、追加の数値フォーマットが受け入れられる場合があります。

base の値が 0 の場合、数値の基数は自動検出されます:プレフィックスが 0 の場合は8進数、プレフィックスが 0x または 0X の場合は16進数、それ以外の場合は10進数となります。

マイナス記号が入力シーケンスの一部であった場合、数字のシーケンスから計算された数値は、結果の型における 単項マイナス による場合と同様に否定されます。

pos が null ポインタでない場合、 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 適用対象 公開時の動作 正しい動作
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 に変換する
(関数)