AtCoder でしばしば問われる「数値と文字列の変換」。出題のたびにググるのがそろそろ面倒くさくなってきたので、頻出の変換をメモ程度にここにまとめておく。なお、 C++ のバージョンは C++20 である。
数値から文字列に変換する
std::to_string()
ですべて対応可能。ただし、小数の変換に関しては、精度を指定することはできない。
リファレンス :
例 :
#include <iostream> #include <string> int main() { int a = 12345; double b = 1.23; double c = 1.23456789; std::string s = std::to_string(a); std::string t = std::to_string(b); std::string u = std::to_string(c); std::cout << s << std::endl; std::cout << t << std::endl; std::cout << u << std::endl; }
出力 :
12345 1.230000 1.234568
数値 (int
型) から 文字 (char
型) に変換する
特別な関数を用いる必要はない。 C++ では内部的にchar
型が連番の整数値で扱われていることを利用して、文字コードでの加算を行って明示的にchar
型にキャストするのが良いだろう。1桁の数値に対してのみ有効なことに注意。
例 :
#include <iostream> int main() { int x = 7; char c = char(x + '0'); std::cout << c << std::endl; }
出力 :
7
文字列から数値に変換する
文字列からint
型への変換はstd::stoi()
を使用する。同様に、long long
型への変換はstd::stoll()
が、double
型への変換はstd::stod()
を使用する。このとき、0埋めは無視される (例参照) 。
また、変換元の数値を表す文字列が変換先の数値型の形式に対応していない場合、例外std::out_of_range
を返す。
リファレンス (他数値型への変換に対応する関数も掲載) :
例 :
#include <iostream> #include <string> int main() { std::string a = "123"; std::string b = "0012"; std::string c = "-12"; std::string d = "123.456"; std::string e = "-1234.56000"; int u = std::stoi(a); int v = std::stoi(b); int x = std::stoi(c); double y = std::stod(d); double z = std::stod(e); std::cout << u << std::endl; std::cout << v << std::endl; std::cout << x << std::endl; std::cout << y << std::endl; std::cout << z << std::endl; }
出力 :
123 12 -12 123.456 -1234.56
文字 (char
型) から数値 (int
型) に変換する
int
tochar
のときと同じ要領で、文字コードでの減算を行ってから明示的にint
型にキャストするのが良いだろう。
例 :
#include <iostream> #include <string> int main() { char c = '7'; int x = int(c - '0'); std::cout << x << std::endl; std::string s = "12345"; for(int i = 0; i < s.size(); i++) { std::cout << int(s[i] - '0') << " "; } std::cout << std::endl; }
出力 :
7 1 2 3 4 5