chiwata’s blog

たまに技術の話をします。

文字列から実数を取得する(C++)

後輩から「C++で、キーボード入力関数を作りたいんですけど、どうしたらいいですか?」と聞かれたので久しぶりにC++を書くことに。

ただお手伝いで書いただけだと勿体無いのでブログにする。

仕様は以下のようにして欲しいらしい。

引数: a,b
入力: a,b
戻り値: 正常なら 0 異常なら -1を返す

最終的に僕が書いたのはこちら

#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

int keyin_double(double &a,double &b){
    int count = 0;
    string str;
    string buf;
    vector<string> input_buf;
    stringstream ss;
    try{
        if( ! ( getline ( cin , str ) ) ) {
            throw -1;
        }
        ss << str ;
        while ( getline (ss, buf, ',') ) {
            input_buf.push_back(buf);
            count++;
        }
        if( ! (count == 2 ) ){
            throw -2;
        }
        a = stod(input_buf[0]);
        b = stod(input_buf[1]);
    }
    catch(int error){
        cout << "ERROR! unexpected value was entered!" << endl;
        cout << "error code" << error << endl;
        return -1;
    }
    catch (const invalid_argument) {
        cout << "ERROR!invalid argument" << endl;
        return -1;
    }
    catch (const out_of_range) {
        cout << "ERROR!out of range" << endl;
        return -1;
    }
    return 0;
}

一行入力受け付けて、カンマ区切りでsprit、型があってないとき、入力された数がおかしい時時、引数が不正な時、引数が許容範囲外の時にエラーを返すようにする。

てきとーなmainを書いて、呼んで実行

[chiwata@HideyukiChiwatanoMacBook-Pro keyboard][keyboard_cout_input *]$ ./a.out
12.1,11.1
12.1 11.1
[chiwata@HideyukiChiwatanoMacBook-Pro keyboard][keyboard_cout_input *]$ ./a.out
11.1,22.2
11.1 22.2
[chiwata@HideyukiChiwatanoMacBook-Pro keyboard][keyboard_cout_input *]$ ./a.out
aa,bb
ERROR!invalid argument
0 0
[chiwata@HideyukiChiwatanoMacBook-Pro keyboard][keyboard_cout_input *]$ ./a.out
111,222,333
ERROR! unexpected value was entered!
error code-2
0 0

とりあえずこんなもんかね。。 getlineで文字列分割できるとしらなかったので、勉強になった。