2013/09/13

文字、文字列と数値を相互に変換する手法

競技プログラミング初心者にとって、文字列と数値の相互変換はその必要性の割にドキュメントが充実していないので大変な障害になる(私自身もそうであった)。そこで備忘録を兼ねて変換の手法をここにまとめておく。言語はC++。

・文字→数値
#include <string>
int main(){
    char c = '1'; 
    // '1'の文字コードは「49」(内部では数値で保存されている)
    int i = c - '0'; 
    // '0'の文字コードは「48」
    cout << i;  
    // 1 が出力される。

    string s = "123";
    int n = s[0] - '0';
    cout << n;  // 1 が出力される。
}


・文字列→数値
#include <string>
#include <sstream>
int main(){
    stringstream ss;
    string s = "123";
    int n;
    ss << s;
    ss >> n;
    cout << n;  // 123 が出力される。

    stringstream ss;
    string s = "12:34";
    int a, b;
    char c;
    ss << s;
    ss >> a >> c >> b;
    cout << a; // 12 が出力される。
    cout << c; //  :  が出力される。
    cout << b; // 34 が出力される。
}


・文字列の一部→数値
#include <string>
int main(){
    string s = "12345";
    string sub = s.substr(1,2);
    //substr( i 番目から, j 文字 ) と呼び出す。
    //以下、上と同様。
}


・数値→文字列
#include <string>
#include <sstream>
int main(){
    stringstream ss;
    int n = 123;
    ss << n;
    string s = ss.str();
    cout << s; // string型の 123 が出力される。
}


主な手法は以上である。特に文字列⇔数値の変換は関数にまとめておくと、substrで直接呼び出せたり単純に手間が省けたりするので良い。また、こうした変換の手法は一つではなく、ここにあげたものよりも良い方法が存在する可能性は大いにあるので注意して欲しい。