C++ での std::string から int への変換: コード例解説

2024-08-19

C++ で std::string を int に変換する方法

C++ で文字列 (std::string) を整数 (int) に変換する方法について説明します。

方法

主に以下の方法があります。

std::stoi 関数 (C++11 以降)

  • 最もシンプルで推奨される方法です。
  • 文字列を整数に変換し、変換できなかった場合は例外を投げます。
  • 使用例:
#include <iostream>
#include <string>

int main() {
  std::string str = "123";
  int num = std::stoi(str);
  std::cout << num << std::endl; // 出力: 123
  return 0;
}

文字列ストリーム (stringstream)

  • 柔軟な方法ですが、少し冗長です。
  • 文字列をストリームとして扱い、そのストリームから整数を読み込みます。
#include <iostream>
#include <string>
#include <sstream>

int main() {
  std::string str = "456";
  int num;
  std::stringstream ss(str);
  ss >> num;
  std::cout << num << std::endl; // 出力: 456
  return 0;
}

atoi 関数 (C スタイル)

  • C から継承された関数で、古いコードで見かけることがあります。
  • 文字列を整数に変換しますが、エラー処理が不十分なので注意が必要です。
#include <iostream>
#include <string>
#include <cstdlib>

int main() {
  std::string str = "789";
  int num = std::atoi(str.c_str()); // c_str() で C スタイルの文字列に変換
  std::cout << num << std::endl; // 出力: 789
  return 0;
}

注意点

  • 文字列に数字以外の文字が含まれている場合、変換エラーが発生します。
  • atoi 関数はエラー処理が不十分なので、可能な限り std::stoi を使用することを推奨します。
  • 大規模な数値を扱う場合は、適切な整数型 (long, long long など) を使用してください。

適切な方法の選択

  • 一般的には std::stoi が最もシンプルで安全な方法です。
  • より柔軟な処理が必要な場合は、stringstream を検討してください。
  • 既存のコードとの互換性が必要な場合のみ atoi を使用してください。



C++ での std::string から int への変換: コード例解説

コード例 1: std::stoi 関数

#include <iostream>
#include <string>

int main() {
  std::string str = "123";
  int num = std::stoi(str);
  std::cout << num << std::endl; // 出力: 123
  return 0;
}
  • #include <iostream>: 入出力ストリームのためのヘッダーファイルです。
  • int main(): プログラムのエントリーポイントです。
  • std::string str = "123";: 文字列 "123" を str という名前の変数に代入します。
  • int num = std::stoi(str);: std::stoi 関数を使って文字列 str を整数に変換し、その結果を num という名前の整数型変数に代入します。
  • std::cout << num << std::endl;: 変数 num の値を出力します。
#include <iostream>
#include <string>
#include <sstream>

int main() {
  std::string str = "456";
  int num;
  std::stringstream ss(str);
  ss >> num;
  std::cout << num << std::endl; // 出力: 456
  return 0;
}
  • std::stringstream ss(str);: 文字列 str をストリーム ss に変換します。
  • ss >> num;: ストリーム ss から整数を読み込み、num に代入します。
#include <iostream>
#include <string>
#include <cstdlib>

int main() {
  std::string str = "789";
  int num = std::atoi(str.c_str());
  std::cout << num << std::endl; // 出力: 789
  return 0;
}
  • #include <cstdlib>: C スタイルの関数のためのヘッダーファイルです。
  • str.c_str(): std::string を C スタイルの文字列に変換します。
  • std::atoi(str.c_str()): atoi 関数を使って C スタイルの文字列を整数に変換します。



手動ループによる変換

  • 文字列の各文字を調べて、数値に変換し、累積していく方法です。
  • 非常に低速でエラー処理が複雑になるため、通常は使用しません。
#include <iostream>
#include <string>
#include <cctype>

int stringToInt(const std::string& str) {
  int result = 0;
  bool negative = false;
  for (size_t i = 0; i < str.length(); ++i) {
    if (i == 0 && str[i] == '-') {
      negative = true;
      continue;
    }
    if (!isdigit(str[i])) {
      // エラー処理: 数字以外の文字が含まれている場合
      return 0; // または例外を投げる
    }
    result = result * 10 + (str[i] - '0');
  }
  return negative ? -result : result;
}

boost::lexical_cast (Boost ライブラリ)

  • Boost ライブラリの機能で、文字列と数値の相互変換を行います。
  • コンパイル時に Boost ライブラリが必要となります。
#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>

int main() {
  std::string str = "123";
  int num = boost::lexical_cast<int>(str);
  std::cout << num << std::endl; // 出力: 123
  return 0;
}

一般的に、std::stoi が最もシンプルで効率的な方法です。他の方法は特殊なケースや学習目的以外ではあまり使用されません。手動ループによる変換は非常に非効率的でエラー処理が複雑になるため、避けるべきです。boost::lexical_cast は便利な機能ですが、Boost ライブラリへの依存が発生します。


c++ string integer



スマートポインタとは何ですか?いつ使うべきですか? (C++、ポインタ、C++11)

スマートポインタは、C++におけるポインタの安全性を向上させるためのテンプレートクラスです。通常のポインタとは異なり、メモリリークやダングリングポインタの問題を自動的に解決します。メモリリークの防止: スマートポインタは、オブジェクトが不要になったときに自動的にメモリを解放します。これにより、メモリリークを防止することができます。...


C++/Cにおける構造体のsizeofとメンバーの和の関係について

日本語解説C++やC言語において、構造体のsizeofは、その構造体内の各メンバーのsizeofの合計と必ずしも一致しません。これは、構造体のメモリレイアウトやパディングによる影響です。メモリアライメント: 多くのプロセッサは、特定のデータ型を特定のアドレス境界に配置することを要求します。例えば、4バイトの整数型は通常4バイト境界に配置されます。...


C++における基底クラスコンストラクタの呼び出し規則の代替方法

C++において、派生クラスのコンストラクタは、その基底クラスのコンストラクタを必ず呼び出さなければなりません。これは、基底クラスの初期化が派生クラスの初期化に先立つ必要があるためです。明示的な呼び出し:class Derived : public Base { public: Derived() : Base(initial_value) { // 派生クラスの初期化 } }; この場合、Base(initial_value)の部分が、基底クラスのコンストラクタを明示的に呼び出しています。...


C++におけるexplicitキーワードの代替方法

explicitキーワードは、C++においてコンストラクタのオーバーロードを制限するために使用されます。コンストラクタは、クラスのオブジェクトを初期化するための特別なメンバ関数です。コンストラクタをオーバーロードすると、異なる引数リストを持つ複数のコンストラクタを定義することができます。...


C++におけるPOD型以外のデータ型 (日本語)

POD (Plain Old Data) 型 は、C++において、C言語の構造体と互換性のある基本的なデータ型のことです。POD型は、メモリレイアウトが単純であり、C言語のデータ型と直接対応しています。これにより、C++とC言語の間でのデータのやり取りが容易になります。...



c++ string integer

C++におけるキャストの比較: Regular Cast, static_cast, dynamic_cast

C++では、異なるデータ型間で値を変換する操作をキャストと呼びます。キャストには、regular cast、static_cast、dynamic_castの3種類があります。最も単純なキャスト方法です。コンパイル時に型チェックが行われますが、実行時に型安全性が保証されません。


C/C++ ビット操作入門: 単一ビットの設定、クリア、トグルの代替方法

C++とCでは、ビットレベルでの操作を行うことができます。これは、低レベルなシステムプログラミングや、効率的なデータ処理において重要です。ビット演算子& : AND| : OR~ : NOT<< : 左シフト>> : 右シフトビット位置は、通常0から始まり、右から左にインデックスされます。


C++におけるクラスと構造体の使い分け:具体的なコード例

C++では、クラスと構造体はどちらもデータと関数をカプセル化するための手段ですが、その使用目的とデフォルトのアクセス修飾子に違いがあります。デフォルトのアクセス修飾子: private主な用途:オブジェクト指向プログラミング (OOP) における抽象的なデータ型を定義する。データの隠蔽とカプセル化を実現する。継承やポリモーフィズムなどのOOPの概念を活用する。


C++におけるポインタ変数と参照変数の違い

ポインタ変数と参照変数は、どちらも他の変数のメモリアドレスを保持するという意味で似ています。しかし、その使用方法や特性にはいくつかの重要な違いがあります。宣言方法: データ型 *変数名;値: 変数のアドレスを保持する。操作:アドレスの変更が可能。*演算子を使って間接参照が可能。->演算子を使って構造体やクラスのメンバにアクセス可能。


C++のswitch文で変数宣言ができない理由:具体的なコード例と解説

C++では、switch文の内部で変数を宣言することができません。この制限は、C++の構文規則によるものです。switch文は、特定の値と比較して、それに対応する処理を実行する制御構造です。変数を宣言した場合、その変数のスコープがswitch文の内部に限定され、switch文の外部からアクセスできなくなります。これは、switch文の構造と目的と相容れないためです。