- ベストアンサー
C++:cinが上手く使えない
そもそもcinについてあまり詳しい事は知らないのですが よろしくおねがいします。 cinを使って整数を取りこもうとする時、数字以外が 入ってしまうとおかしな動作をします。 例えば「10未満の整数値を取りこむまで続くループ」で 入力部分を作ろうとした時に、 while(1){ cout << "入力してください" << endl; cin >> int_a; if(int_a < 10) break; } 大体 以上の様に書くと、入力する時にアルファベットが 入ってしまうと 入力して下さい 入力して下さい …(エンドレス)… 入力して下さい となってしまいます。cinをあきらめてscanfにしてみると 今度は実行時エラーがでてしまいます。 整数を入力する事が出来て、なおかつアルファベットが 入力されても' 'で囲った値が入るようにするには どのようにすればよいでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
失礼しました 1でしているような エラーのクリアとデータの破棄を忘れていました #include <iostream> using namespace std; void main(void) { int int_a; while(true) { cout << "入力してください" << endl; cin >> int_a; if(cin.good()==0) { cout<<"変なものを入力しないでください"<<endl; cin.clear(); cin.seekg(0); break; } cout<<int_a<<"が入力されました"<<endl<<endl; if(int_a < 10) break; } }
その他の回答 (4)
- nubou
- ベストアンサー率22% (116/506)
アルファベットが入力されても' 'で囲った値が入るようにするにはどのようにすればよいでしょうか? //gomi29.cpp #include <iostream> #include <string> using namespace std; void main(void) { int int_a; while(true) { string str_a; cout << "入力してください:"; cin >> str_a; if(cin.good()==0) { cout<<"変なものを受信"<<endl<<endl; cin.clear();cin.seekg(0); } else { cout<<str_a<<"を受信"<<endl; if(str_a=="quit")break; int_a= atoi(str_a.substr(str_a.find('\'')+1).c_str()); int_a++; cout<<"入力+1="<<int_a<<endl<<endl; } } } //結果 C:borland>gomi29 入力してください:3 3を受信 入力+1=4 入力してください:abc'3'd abc'3'dを受信 入力+1=4 入力してください:abc abcを受信 入力+1=1 入力してください:abc'd'e abc'd'eを受信 入力+1=1 入力してください:quit quitを受信 入力+1=1 C:borland> //数字が無い場合にはatoiは0を出力
お礼
atoiの引数が複雑ですね。 何度もありがとうございます。 今回は特に気合を入れて組ませてもらいます。
- nubou
- ベストアンサー率22% (116/506)
#include <iostream> #include <string> using namespace std; void main(void) { while(true) { string str_a; cout << "入力してください:"; cin >> str_a; if(cin.good()==0) { cout<<"変なものを受信"<<endl<<endl; cin.clear();cin.seekg(0); } else { cout<<str_a<<"を受信"<<endl<<endl; if(str_a=="quit")break; } } } とすれば数字でも文字でも取り込めます 整数型にするにはatoiを使えばいいでしょう
お礼
3度目の助言、感謝します
- nubou
- ベストアンサー率22% (116/506)
#include <iostream> using namespace std; void main(void) { int int_a; while(1) { cout << "入力してください" << endl; cin >> int_a; if(cin.good()==0) { cout<<"変なものを入力しないでください"<<endl; break; } cout<<int_a<<"が入力されました"<<endl<<endl; if(int_a < 10) break; } }
- asuca
- ベストアンサー率47% (11786/24626)
while( 1 ) { std::cout << "入力してください" << std::endl; std::cin >> iGotData; if( !std::cin.fail() ) // 整数値が入力されました。 break; //ループから抜けます。 // 整数値以外が入力されました。 std::cin.clear(); // エラーをリセットします。 std::cin.ignore( 1024, '\n' ); // 文字列を破棄します。 } というような判定部分を入れてやればいいのでは?
お礼
早速の回答をありがとうございます。cinにも色々な 関数が用意されてるのですねぇ。それらの仕様もあれば 言う事なしなのですが、そういうのが載ってるページは ありそうなので探してみます。 ありがとうございました。
お礼
無作法ですが2の方とまとめてお礼を言わせてもらいます。 ありがとうございました。
補足
入力のチェックやデータの破棄に使ってるメンバ関数(言葉あってます?) が1とは異なりますが、同じ動作が得られるものなのか それとも処理系による差なのか自分の知識では及びませんが そこは調べてみようと思います。