文字列から実数を取得する(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
で文字列分割できるとしらなかったので、勉強になった。