C++ での std::string から int への変換: コード例解説
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