• ベストアンサー

C++:cinが上手く使えない

 そもそもcinについてあまり詳しい事は知らないのですが よろしくおねがいします。  cinを使って整数を取りこもうとする時、数字以外が 入ってしまうとおかしな動作をします。  例えば「10未満の整数値を取りこむまで続くループ」で 入力部分を作ろうとした時に、 while(1){  cout << "入力してください" << endl;  cin >> int_a;  if(int_a < 10) break; } 大体 以上の様に書くと、入力する時にアルファベットが 入ってしまうと 入力して下さい 入力して下さい …(エンドレス)… 入力して下さい となってしまいます。cinをあきらめてscanfにしてみると 今度は実行時エラーがでてしまいます。  整数を入力する事が出来て、なおかつアルファベットが 入力されても' 'で囲った値が入るようにするには どのようにすればよいでしょうか?

  • help
  • お礼率85% (17/20)

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

  • ベストアンサー
  • nubou
  • ベストアンサー率22% (116/506)
回答No.3

失礼しました 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; } }

help
質問者

お礼

 無作法ですが2の方とまとめてお礼を言わせてもらいます。 ありがとうございました。

help
質問者

補足

 入力のチェックやデータの破棄に使ってるメンバ関数(言葉あってます?) が1とは異なりますが、同じ動作が得られるものなのか それとも処理系による差なのか自分の知識では及びませんが そこは調べてみようと思います。

その他の回答 (4)

  • nubou
  • ベストアンサー率22% (116/506)
回答No.5

アルファベットが入力されても' 'で囲った値が入るようにするにはどのようにすればよいでしょうか? //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を出力

help
質問者

お礼

 atoiの引数が複雑ですね。 何度もありがとうございます。  今回は特に気合を入れて組ませてもらいます。

  • nubou
  • ベストアンサー率22% (116/506)
回答No.4

#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を使えばいいでしょう

help
質問者

お礼

3度目の助言、感謝します

  • nubou
  • ベストアンサー率22% (116/506)
回答No.2

#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)
回答No.1

while( 1 ) { std::cout << "入力してください" << std::endl; std::cin >> iGotData; if( !std::cin.fail() ) // 整数値が入力されました。 break; //ループから抜けます。 // 整数値以外が入力されました。 std::cin.clear(); // エラーをリセットします。 std::cin.ignore( 1024, '\n' ); // 文字列を破棄します。 } というような判定部分を入れてやればいいのでは?

help
質問者

お礼

 早速の回答をありがとうございます。cinにも色々な 関数が用意されてるのですねぇ。それらの仕様もあれば 言う事なしなのですが、そういうのが載ってるページは ありそうなので探してみます。  ありがとうございました。

関連するQ&A

  • ループ中でのscanfおよびcin

    あまりに基礎的な質問ですが,ループ中の入力関数が期待する動作になりません. コードを載せます while (1) { int key; scanf("%d", &key); if (key == 1) break; } 期待する動作は1が入力されるまでループし続けるというものですが scanfは一度しか実行されずループし続けます,cinに変えても同様でした 何が原因か分かる方,ご教示ください

  • VC++でプログラムの勉強をしています。

    プログラムは最近はじめたばかりです。While文とif文を使ってクイズを作ってみたところ、一個目のsinで入力を求めているところから無限ループになってしまいました。色々調べてcin.cler()とsin.ignore()を入れたりもしてみましたが上手くいきませんでした。どこを間違えているのでしょうか? //クイズ #include <iostream> using namespace std; int main()//cin.clear();cin.ignore();???? { int a; int b; while(1) { cout<<"ネコ型のロボットが出てくるアニメといえば?"<<endl; cout<<"A)ドラえもん B)ドラエもん C)ほりえもん D)サザエさん"<<endl; cin>>a; if(a=='A') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){break;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} if(b!='Y'||'N'){cout<<"正しく入力してね!"<<endl;} } if(a=='B'||'C'||'D') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){cout<<"残念!!"<<endl;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} } if(a!='A'||'B'||'C'||'D'){cout<<"正しく入力してね!"<<endl;} } cout<<"正解!!"<<endl; }

  • C++の無限ループを解決してください

    アルゴリズムを勉強するときに以下のソースを書きました; void weighted_quick_union_algorithm() { static const int volume = 10; enum status { terminate_, union_, find_ }; string str; status sta; vector<int> system(volume, 0); vector<int> size(volume, 1); for (int index = 0; index != volume; ++index) { system[index] = index; } do { cout<<"cin"<<endl; cin >> str; for (string::size_type index = 0; index != str.size(); ++index) str[index] = toupper(str[index]); if (str == "UNION") sta = union_; else if (str == "FIND") sta = find_; else if (str == "TERMINATE") sta = terminate_; switch (sta) { case(0): { cout << str << endl; break; } case(1): { cout << str << sta << endl; int p(0), q(0), i(0), j(0); while (cin >> p) { cin >> q; for (i = p; i != system[i]; i = system[i]); for (j = q; j != system[j]; j = system[j]); if (i == j) continue; if (size[i] < size[j]) { system[i] = j; size[j] += size[i]; } else { system[j] = i; size[i] += size[j]; } cout << p << " - " << q << endl; } cout<<"break"<<endl; break; } case(2): { cout << str << sta << endl; break; } } } while (sta); } しかし unionを入力しあと ; でwhile(cin>>p)をブレイクしたら cin break UNION1 cin break Union1 で無限ループ 結構時間かかったが間違いがわかりません ちなみに最少は while(cin>>p>>q)と書いていましたが同じ結果です。 どうかお願いします

  • Yesならこっちへ、NOならあっちへ(c++)

    取り組んでる課題で、Yとタイプしたら1のステップにいけて、Nとタイプしたら2のステップに行くというところでわからなくなってしまいました。Userにそういう選択させるのには何をどう書いたらいいのですか? --------------------------------------------------------------------- 問題:1から100までの整数をUserに選ばせ、Userに、「選んだ数字はXX以上ですか?」と質問を繰り返し、最後にUserの選んだ数字を当てるという課題です。(Userはそれに対してYes/Noでしか答えられません。) --------------------------------------------------------------------- int max=100; int min=0; int mid, x; int systemtype=y, sytemtype=n; main(){ while(1){ cout<<"1から100までで好きな数字を選んでね。"; cin>> x; if (n<=0 || n>=100){ break; } if (mid == (max + min)/2){ cout<<"選んだ数字は :" << mid << " より大きい? "<< endl; cout<<" y は YES, n は NO :" << endl; } else if(min == max){ cout<<"その数字は" << x <<endl; break; } else if(min == mid){ mid += ( max - mid)/2; cout<<"あなたの選んだ数は :" << mid <<" より大きい? "<<endl; } else if(max == mid){ mid -= (mid - min)/2; cout<<"あなたの選んだ数は:" << mid << " より大きい? "<< endl; } else cout<<"その数字は :"<< n <<endl; } return 0; }

  • コンソールで整数を入力(C#)

    C#でコンソールから整数を入力したいのですが、 やり方がみつかりません。分かる方教えてください。 C++だと下のようなコードです。 int a; cout<<"整数を入力して!"; cin>>a; cout<<"入力した整数は:"<<a; こんなこと分からなくてすみません...

  • macのXcodeにおけるcinについて

    現在macOSXver10.4.11のXcode2.4.1を用いて C++言語の勉強をしています。 以下のソースをコンパイルしようとしてますが「std::cin >> str1;」の行で「error: no match for 'operator>>' in 'std::cin >> str1;'」と出てコンパイルに失敗します。 原因が分かる方がいればご教授願います。 #include <iostream> #include <stdio.h> int main (void) { char *str1[32], *str2[32]; std::cout << "何か入力して下さい ==>"; std::cin >> str1; std::cout << "あなたは" << str1 << "と入力しましたね。" << std::endl; printf("何か入力してください。==>"); scanf("%s",str2); printf("あなたは、%sと入力しましたね。\n",str2); return 0; } 初歩的な質問ですみませんがご回答の程よろしくお願い致します。

  • C++の問題の問題なんですが

    a = 3+aを代入演算子を用いて表現せよ。ってどうすればいいんですか? a+=3;ですか? 以下のように出力されるプログラムを作成せよ 年齢を入力してください 16 生まれた年を入力してください 1986 好きな数字を入力してください 7 あなたは1986年生まれの16才で、7が好きですね #include <iostream> using namespace std; int main(){ cout << "年齢を入力してください\n" << 16 << endl; cout << "生まれた年を入力してください\n" << 1986 << endl; cout << "好きな数字を入力してください\n" << 7 << endl; cout << "あなたは1986年生まれの16才で、7が好きですね" << endl; return0; } 上の問題にcinを一度だけ使って表現せよ 1番最初のプログラムはこうでいいのかなと思うんですが、次のcinを一度だけ使って表現せよって言うのが分かりません。実行結果も含めて教えてもらえませんか?

  • do-while 文でコンパイルエラーがでます。。

    下記グローバル関数Run内のdo-while文で、 error C2059: syntax error : '}' というコンパイルエラーが起きるのですが、どうしても理由がわかりません; do-whileをコメントアウトしコンパイルしてみたところ正常に動くので、そこがおかしいのは間違いないと思います。 どなたかお力添えをお願いいたします。。 #include <iostream> #include "BinaryTree.cpp" using namespace std; void Run(); int main() { Run(); return 0; } void Run() { BinaryTree<int> *bt; char input; do { cout<<"Menu Display"<<endl; cout<<"---------------------"<<endl; cout<<"1> Enter data"<<endl; cout<<"2> Print Tree"<<endl; cout<<"3> Reverse Tree"<<endl; cout<<"4> Quit"<<endl; cout<<"Enter your choice: "; cin>>input; switch (input) { case '1': int elem; cout<<"Enter data for tree: "; cin>>elem; if (bt == NULL) bt = new BinaryTree<int>(elem); else bt->Insert(elem); break; case '2': if (bt == NULL) cout<<"The tree is empty."<<endl; else { cout<<"Tree size = "<<bt->Size(bt)<<endl; cout<<"---------------------"<<endl; bt->Inorder(bt); } break; case '3': if (bt == NULL) cout<<"The tree is empty."<<endl; bt->Reverse(bt); break; }while (input != '4'); } }

  • cinで、異なる型のデータが入力された時の対処法

    こんにちは。 OSは現在、64bit版のWindows7を使っています。 C++のcinストリームで指定した変数の型とは異なる型のデータが入力された時に、再びデータを入力するように促すC++プログラムを作成しました。 そのプログラムの内容は以下の通りです。(main関数のみ) ------------------------------------------------------------ int main() { int int_a=0; while(true) { cout << "整数値を入力せよ。:"; cin >> int_a; nn; if(cin.good()==0){ //cin.good()は、直前のcinで入力されたデータ型が、指定した変数の型に一致しなければ、0を返す。 cout<<"整数値以外のデータが入力された。"<<endl; cin.clear(); //cinストリームの入力バッファをクリアする。 cin.seekg(0); //cinストリームの入力バッファの先頭に移動する。 continue; } else{ break; } } return 0; } ------------------------------------------------------------ コマンドプロンプト上で、Borland C++ Compiler 5.5 のbcc32コマンドを使い、 上記のソースから実行ファイルをビルドして実行すると、以下のように上手くいきました。 ------------------------------------------------------------ C:\Emacs_for_Windows\C_and_C++_Programs >bcc32 1.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 1.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland C:\Emacs_for_Windows\C_and_C++_Programs >1.exe 整数値を入力せよ。:a 整数値以外のデータが入力された。 整数値を入力せよ。:abc 整数値以外のデータが入力された。 整数値を入力せよ。:-1 -1が入力された。 C:\Emacs_for_Windows\C_and_C++_Programs > ------------------------------------------------------------ 一方、Gnu Emacs for Windows 23.4のシェルモードで、Cygwinのbashを使い、Cygwinのg++-3.exeを使って実行ファイルをビルドし、それを実行してみると、以下のように上手く動作しませんでした。。 ------------------------------------------------------------ Kei-Lavie@Kei: ~/C_and_C++_Programs/Cpp_Programs $ /bin/g++-3.exe 1.cpp Kei-Lavie@Kei: ~/C_and_C++_Programs/Cpp_Programs $ ./a.exe 整数値を入力せよ。:a 整数値以外のデータが入力された。 整数値を入力せよ。: 整数値以外のデータが入力された。 整数値を入力せよ。: 整数値以外のデータが入力された。 整数値を入力せよ。: 整数値以外のデータが入力された。 整数値を入力せよ。: ・ ・ ・ ------------------------------------------------------------ 一体何がいけないのかわからず、困っています。 ちなみに、Emacsのシェルモードで、CygwinのbashをUTF-8環境で使えるように設定しているので、ソースファイルのエンコーディングはUTF-8(BOMなし)で、改行コードはCRCLにしています。 BCCのbcc32コマンドでは、エンコーディングシステムはSJISしか扱えないようなので、UTF-8からSJISに変更してコンパイルしました。 以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

  • C++ の while ループ

    C++の基本学習者です。Windows 10 で Visual Studio Community 2015 を使っています。 教本に載っている、機械語のプログラムをC++でシミュレーションする、というものを作ろうと、途中まで下のようなコードを書き込み、そこまで間違いがないかを確かめるために、コンパイルして実行したら、添付の写真のようなエラーメッセージが出てきました。 // ConsoleApplication65.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" #include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> #include <cmath> #include <cstring> using namespace System; using namespace std; int main() { // variables int program = 0; int accumulator = 0; int count = 0; int instructionRegister = 0; int operationCode = 0; int operand = 0; int location[100]; cout << "*** Welcome to Simpletron ***" << endl; cout << "*** Please enter your program ***" << endl; cout << "*** one instruction at a time,***" << endl; cout << "*** after the location number and and the prompt of '?' ***" << endl; cout << "*** To stop entering instructions, ***" << endl; cout << "*** enter -9999 . ***" << endl << endl; cout << setfill('0') << internal; cout << setw(3) << count << " ? "; cin >> program; while (program != -9999) { location[count] = program; count++; } return 0; } while ループに問題がありそうですが、コンパイルはちゃんとできたのに、何が悪いのでしょうか? 詳しい方、どうぞ教えてください。お願いします。

専門家に質問してみよう