Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

【C++】数値と文字列の相互変換まとめ

AtCoder でしばしば問われる「数値と文字列の変換」。出題のたびにググるのがそろそろ面倒くさくなってきたので、頻出の変換をメモ程度にここにまとめておく。なお、 C++ のバージョンは C++20 である。

数値から文字列に変換する

std::to_string()ですべて対応可能。ただし、小数の変換に関しては、精度を指定することはできない。

リファレンス :

cpprefjp.github.io

例 :

#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を返す。

リファレンス (他数値型への変換に対応する関数も掲載) :

cpprefjp.github.io

例 :

#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型) に変換する

inttocharのときと同じ要領で、文字コードでの減算を行ってから明示的に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