• ベストアンサー

C++流入力の妥当性チェック方法

お世話になります。 C言語の入門書には、scanfを使って数字を入力させる時は、一旦文字列に入力させ、atoiを使って数値に変換すると良いと書いてありました。 #include "stdafx.h" #include "iostream" #include "cstring" #include "string" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int num=0; // char tmp[20]; string tmp; num=atoi(gets(tmp)); cout << num; return 0; Cの本にかいてある物をC++っぽく書いてみたつもりです。 しかしこれではchar tmp[20]を使ったとき、入力した文字列が数字以外の時はnum=0になってしまい、入力として0を与えたのか入力エラーなのか判定できません。 また、tmp[20]としているので、20文字以上入力された場合、実行エラーが発生してしまいます。 そこで、string tmpとしてやることで、入力される文字数を考えることなくプログラミングできるようにすればいいじゃないかと考えたのですが、atoiはcharにしか対応していないので、stringでは使えません。 stringを使って入力される文字数問題を考えることなく、また、数字以外の入力を受け付けないようにするスマートな方法はないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★簡単にアドバイス >数字以外の入力を受け付けないようにするスマートな方法はないのでしょうか?  ↑  ない。 >入力した文字列が数字以外の時はnum=0になってしまい、 >入力として0を与えたのか入力エラーなのか判定できません。  ↑  C関数なら strtol() 関数などがありますけど。  http://oshiete1.goo.ne.jp/qa3145655.html→『数字以外が入力されたらエラー文を出したい。』  を参考に。 ・以上。

sollalice
質問者

お礼

strtol関数ですか。 Cライブラリを探してみると使えるものがありそうですね。 ありがとうございました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

int num; std::cin >> num; if (std::cin.fail()) {  // エラー処理 } で十分でしょう。

sollalice
質問者

お礼

これが一番簡単そうな気がします。 C#と違ってVC++のインテリセンスの説明は英語なので難しそうですが、 cinのメンバもいろいろ調べてみたいと思います。 ありがとうございました。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

try {  num = boost::lexical_cast<int>(tmp); } catch ( boost::bad_lexical_cast const& e ) {  ... } とか?

sollalice
質問者

お礼

例外処理ですね。 C#のように簡単ではなさそうですが、使いこなせれば強力な処理 だと思うので、しっかり勉強してみたいと思います。 ありがとうございました。