C++ で Int を文字列に変換する方法
-
文字列化マクロを使用して
int
リテラルを文字列に変換する -
int から文字列への変換には
to_string()
メソッドを使用する -
int から文字列への変換には
std::stringstream
クラスとstr()
メソッドを利用する -
int から文字列への変換には
std::to_chars
メソッドを利用する
この記事では、C++ で int
を文字列に変換するメソッドを紹介します。
文字列化マクロを使用して int
リテラルを文字列に変換する
このメソッドは、int から文字列への変換に関しては非常に限られた用途しか持ち合わせていません。すなわち、いわゆるハードコードされた数値を string
型に変換する必要がある場合にのみ利用できます。
マクロはプログラマが名前を割り当てるコードブロックであり、その名前が使われるたびにマクロ展開(マクロ文の右の部分)に置き換えられます。
これは C/C++ のプリプロセッサの機能で、リテラル値でしか使えません。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
#define STRING(num) #num
int main() {
string num_cstr(STRING(1234));
num_cstr.empty() ? cout << "empty\n" : cout << num_cstr << endl;
return EXIT_SUCCESS;
}
出力:
1234
ただし、他のマクロ展開の結果を文字列化したい場合(この例では NUMBER
が 123123
に展開されます)、次のコードブロックに示すように 2 レベルのマクロを定義する必要があることに注意してください。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
#define STRING(num) STR(num)
#define STR(num) #num
#define NUMBER 123123
int main() {
string num_cstr(STRING(NUMBER));
num_cstr.empty() ? cout << "empty\n" : cout << num_cstr << endl;
return EXIT_SUCCESS;
}
出力:
123123
int から文字列への変換には to_string()
メソッドを使用する
to_string
は組み込みの <string>
ライブラリ関数であり、引数に数値を受け取り string
オブジェクトを返します。このメソッドはこの問題の解決策として推奨されています。しかし、浮動小数点値を to_string
メソッドに渡すと、以下のコード例のように予期せぬ結果が得られることに注意してください。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main() {
int n1 = 9876;
double n2 = 0.0000000000000000000001;
double n3 = 2.000000000000123;
string num_str1(std::to_string(n1));
string num_str2(std::to_string(n2));
string num_str3(std::to_string(n3));
num_str1.empty() ? cout << "empty\n" : cout << num_str1 << endl;
num_str1.empty() ? cout << "empty\n" : cout << num_str2 << endl;
num_str1.empty() ? cout << "empty\n" : cout << num_str3 << endl;
return EXIT_SUCCESS;
}
出力:
9876
0.000000
2.000000
int から文字列への変換には std::stringstream
クラスと str()
メソッドを利用する
このクラスは string
のインスタンスを内部的に保存し、stringstream
の内容から string
オブジェクトを取得するための str()
メソッドを提供します。
#include <iostream>
#include <sstream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main() {
int n1 = 9876;
std::stringstream sstream;
sstream << n1;
string num_str = sstream.str();
num_str.empty() ? cout << "empty\n" : cout << num_str << endl;
return EXIT_SUCCESS;
}
出力:
9876
int から文字列への変換には std::to_chars
メソッドを利用する
以下のメソッドは他のメソッドに比べて比較的面倒です。変換結果の保存のために一時的な char
配列を初期化する必要があるからです。しかし、プラス面としては、このメソッドはロケールに依存せず、割り当てを行わず、スローもしません。関数 to_chars
は char
配列の範囲を受け取り、整数を文字列に変換します。文字を変数 arr
に格納すると、新しい string
オブジェクトが arr.data()
引数で初期化されます。
#include <array>
#include <charconv>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
#define MAX_DIGITS 100
int main() {
int n1 = 9876;
std::array<char, MAX_DIGITS> arr{};
std::to_chars(arr.data(), arr.data() + arr.size(), n1);
string num_str(arr.data());
cout << num_str << endl;
return EXIT_SUCCESS;
}