C++ で文字列から整数を解析する

胡金庫 2023年10月12日
  1. 文字列から整数を解析するには std::stoi 関数を用いる
  2. 関数 std::from_chars を用いて文字列から整数を解析する
C++ で文字列から整数を解析する

この記事では、C++ で文字列から整数をパースする方法をいくつか説明します。

文字列から整数を解析するには std::stoi 関数を用いる

関数 stoistring ヘッダで定義されている文字列ライブラリの一部であり、文字列の値を異なる数値型に変換するために利用することができます。符号付き整数変換には std::stoistd::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 は入力文字列の先頭の - 記号しか扱えないので、次の例では num5num6 というゴミのような値を出力しています。

#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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Integer