C++ で文字列から整数を解析する
胡金庫
2023年10月12日
この記事では、C++ で文字列から整数をパースする方法をいくつか説明します。
文字列から整数を解析するには std::stoi
関数を用いる
関数 stoi
は string
ヘッダで定義されている文字列ライブラリの一部であり、文字列の値を異なる数値型に変換するために利用することができます。符号付き整数変換には std::stoi
、std::stol
および std::stoll
が用いられます。関数 stoi
は単一の string
オブジェクトを必須引数として受け取りますが、プログラマは整数を格納するアドレスと入力文字列を処理する数値ベースを指定することもできます。
以下の例は、stoi
関数の複数のユースケースを示しています。なお、stoi
は文字列中の先頭の空白文字を扱うことができますが、それ以外の文字を扱うと std::invalid_argument
例外が発生します。
#include <charconv>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::stoi;
using std::string;
int main() {
string s1 = "333";
string s2 = "-333";
string s3 = "333xio";
string s4 = "01011101";
string s5 = " 333";
string s6 = "0x33";
int num1, num2, num3, num4, num5, num6;
num1 = stoi(s1);
num2 = stoi(s2);
num3 = stoi(s3);
num4 = stoi(s4, nullptr, 2);
num5 = stoi(s5);
num6 = stoi(s6, nullptr, 16);
cout << "num1: " << num1 << " | num2: " << num2 << endl;
cout << "num3: " << num3 << " | num4: " << num4 << endl;
cout << "num5: " << num5 << " | num6: " << num6 << endl;
return EXIT_SUCCESS;
}
出力:
num1: 333 | num2: -333
num3: 333 | num4: 93
num5: 333 | num6: 51
関数 std::from_chars
を用いて文字列から整数を解析する
別の方法として、ユーティリティライブラリの from_chars
関数は int
値を解析することができます。これは C++17 バージョンから標準ライブラリに含まれており、<charconv>
ヘッダファイルで定義されています。
stoi
とは大きく異なり、from_chars
はオブジェクトの長さや境界線を意識せずに文字の範囲を操作します。したがって、プログラマは最初の 2つの引数に範囲の開始と終了を指定しなければなりません。3 番目の引数は変換された値を代入する変数 int
です。
ただし、from_chars
は入力文字列の先頭の -
記号しか扱えないので、次の例では num5
と num6
というゴミのような値を出力しています。
#include <charconv>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::from_chars;
using std::stoi;
using std::string;
int main() {
string s1 = "333";
string s2 = "-333";
string s3 = "333xio";
string s4 = "01011101";
string s5 = " 333";
string s6 = "0x33";
int num1, num2, num3, num4, num5, num6;
from_chars(s1.c_str(), s1.c_str() + s1.length(), num1);
from_chars(s2.c_str(), s2.c_str() + s2.length(), num2);
from_chars(s3.c_str(), s3.c_str() + s3.length(), num3);
from_chars(s4.c_str(), s4.c_str() + s4.length(), num4, 2);
from_chars(s5.c_str(), s5.c_str() + s5.length(), num5);
from_chars(s6.c_str(), s6.c_str() + s6.length(), num6);
cout << "num1: " << num1 << " | num2: " << num2 << endl;
cout << "num3: " << num3 << " | num4: " << num4 << endl;
cout << "num5: " << num5 << " | num6: " << num6 << endl;
return EXIT_SUCCESS;
}
出力:
num1: 333 | num2: -333
num3: 333 | num4: 93
num5: -1858679306 | num6: 0
著者: 胡金庫