【C++】string型を数値型に変換する方法【string to int/double等々】


std::string → 数値

文字列std::stringint等の数値型に変換する方法です。

int型の場合はstd::stoi関数、double型の場合はstd::stodを用いることで数値変換が可能です。

std::string str = "3.14";
std::stoi(str); // 3
std::stod(str); // 3.14

変換関数一覧

long型やfloat型用の専用関数も用意されています。

対応する関数
intstd::stoi
longstd::stol
unsigned longstd::stoul
long longstd::stoll
unsigned long longstd::stoull
floatstd::stof
doublestd::stod
long doublestd::stold
スポンサーリンク

例外

文字列を数値に変換出来なかった場合にはstd::invalid_argument例外が発生し、プログラムは異常終了します。C言語のatoi関数とは挙動が異なるため注意が必要です。

// 実行時エラー: libc++abi.dylib: terminating with uncaught exception of type std::invalid_argument: stoi: no conversion
std::stoi("mad");

std::atoi("mad"); // エラーにならない。戻り値は0

以下の方法で例外を捕捉します。

try {
  std::stoi("mad");
} catch (const std::invalid_argument& e) {
  // 変換失敗時の処理
  std::cout << e.what(); // "stoi: no conversion"
  std::cout << "変換に失敗しました";
}

特殊な形式の数値を変換する

16進数や指数表記の数字を変換することも可能です。また文字列中の先頭空白文字は変換時に無視されます。

std::stoi("9kg");     //  9(末尾文字は無視される)
std::stod("\t\n 12"); // 12(先頭の空白は無視される)

std::stod("1e3");  // 1000(指数表記からの変換)

std::stod("0x02"); // 2(16進数からの変換)
stoiやstoulで16進数の変換を行う際には後に説明する# 第三引数 ─ 基数の指定の利用が必要です。

第二引数 ─ インデックスの取得

第二引数にsize_t型のポインタを渡すことで、文字列中の「変換完了位置+1」のインデックスを取得することが可能です。

size_t index;

std::stod("3.1", &index);
index; // 3

std::stod(" 1e4 ", &index);
index; // 4

第三引数 ─ 基数の指定

第三引数に基数を指定することが可能です。

2を指定すれば2進数、16を指定すれば16進数として文字列の変換作業が行われます。

std::stoi("1000", nullptr, 2); //  8 (0b1000 2進数)
std::stoi("10", nullptr, 8);   //  8(010    8進数)
std::stoi("10", nullptr, 16);  // 16 (0x10  16進数)

std::stoi("0xF", nullptr, 16);  // 15 (0x0F)
std::stoi("F", nullptr, 16);    // 15 (0x0F)
std::stoi("F", nullptr, 2);     // 例外発生:std::invalid_argument: stoi: no conversion

第三引数に0が指定された場合は基数の自動判定が行われます。

std::stoi("010", nullptr, 0);  //  8( 8進数)
std::stoi("0xf", nullptr, 0);  // 15(16進数)

広告