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

このQ&Aのポイント
  • C++のcinストリームで指定した変数の型とは異なる型のデータが入力された時に、再びデータを入力するように促すC++プログラムを作成しました。
  • ビルドした実行ファイルはWindows7で正常に動作しましたが、Cygwinの環境ではうまく動作しなかったため困っています。
  • BCCのbcc32コマンドではエンコーディングシステムはSJISしか扱えず、CygwinのbashはUTF-8環境で設定されているため、エンコーディングの違いが問題かもしれません。
回答を見る
  • ベストアンサー

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に変更してコンパイルしました。 以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

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

  • ベストアンサー
  • koakino
  • ベストアンサー率44% (22/50)
回答No.1

cin.clear()はエラーをクリアするメソッドです。 これだけではバッファはクリアされないのでおかしなことになります。 例えば次の方法があります。 if(cin.good()==0){ cout<<"整数値以外のデータが入力された。"<<endl; cin.clear(); cin.ignore(256, '\n'); continue; }

MetalLover
質問者

お礼

御回答ありがとうございます。 おかげで解決できました。

関連するQ&A

  • エラーに関する質問

    Fatal: オプションが必要 : Lc:\Borland\Bcc55\lib ↑のようなエラーが出のですが、解決方法がわかりません 解決方法がわかる方がいましたら教えてください ついでに使ってる開発環境はBCC Developerです ↓は、コンパイル使用としたソースコードと、コンパイルの経過です #include <iostream.h> using namespace std; void main() { int i; int t; int p; char g; while(i=4578){ cin>>p; cin>>g; cin>>t; if(i==t) cout<<"test"; break; }; }; 経過 > C:\borland\bcc55\Bin\make.exe -fDebug\roger.mak INIT TARGET MAKE Version 5.2 Copyright (c) 1987, 2000 Borland echo -WC -3 -Od -w- -AT -pc -H- -k -b -v -y -L"c:\Borland\Bcc55\lib" -DDEBUG -nDebug -c > Debug\roger.rsp echo C:\WINDOWS\デスクトップ\プロジェクト\roger\hyahya.cpp >> Debug\roger.rsp bcc32 @Debug\roger.rsp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland C:\WINDOWS\デスクトップ\プロジェクト\roger\hyahya.cpp: bcc32 -WC -3 -Od -w- -AT -pc -H- -k -b -v -y -L"c:\Borland\Bcc55\lib" -DDEBUG -eDebug\roger.exe Debug\hyahya.obj Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: オプションが必要 : Lc:\Borland\Bcc55\lib ** error 1 ** deleting Debug\roger.exe Make End !! (Elapsed time 0:00.923)

  • C言語のコンパイラ操作について教えてください。

    Borland社が提供していますBorland C++ Compilerというものを使わせていただいてるのですが、初心者の私には難しいのです。 コマンドプロントというのでしょうか・・ C:\Document and Settings\xxxx> と、出てきたので C:\Document and Settings\xxxx>\borland\BCC55\bin と入力しましたら C:\borland\BCC55\bin> に変わりました。 普通にインクルードのプログラムから始められる画面にするにはここからどうすればよろしいのでしょうか?? C:\borland\BCC55\bin>dir と、入力しましたら、何だかbcc32.cfgとかilink32.cfg とか、他にたくさんのデータが表示されました。 どうしたらよろしいのでしょう、よろしくお願いいたします。質問が足りないときは補足させていただきます。

  • 「外部シンボルが未解決」について教えてください

    BCCを使ってます。windowsのプログラムで、『外部シンボル 'MyCreateFontが未解決』と言うメッセージが出たのですが、リンクエラーなのでしょうか? また、『外部シンボル○○が未解決』と表示された場合、どのような処置をすればいいですか。アドバイスをお願いします。 D:\borland\bcc55\lesson>bcc32 -W -w-8057 timer.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland timer.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'MyCreateFont(int, unsigned long, const char *)' が未解決(D:\BORLAND\BCC55\LESSON\TIMER.OBJ が参照 ) こちらが、宣言の部分です。 #include <windows.h> #define ID_MYTIMER 100 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); HFONT MyCreateFont(int, DWORD, LPCTSTR); char szClassName[] = "clock"; //ウィンドウクラス int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow)

  • BCC Developerでのメイクでエラーが出る

    C++を勉強し始めたものですが、BCC Developerでメイクしたときにエラーがでて、コマンドプロンプトが表示されなくて困っています。 http://www.plustarnet.com/aspil/Programming/c00.htmを参考に、 Borland C++ Compiler 5.5とBCC Developer、setbccをインストールし、 http://www.plustarnet.com/aspil/Programming/c01.htmを参考に void main(void) { } という簡単なプログラムをメイクしたのですが、 エラーが出てしまいます。 以下が、そのエラーのときに表示された文です。 > "C:\Program Files\borland\bcc55\Bin\make.exe" -f.\SampleSTG.mak TARGET MAKE Version 5.2 Copyright (c) 1987, 2000 Borland bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -n. -c "C:\Documents and Settings\匿名\デスクトップ\SampleSTG\first.cpp" Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland c:\documents and settings\匿名\デベハトップ\samplestg\first.cpp: エラー F1009 c:\documents and settings\匿名\デベハトップ\samplestg\first.cpp: 入力ファイル 'c:\documents and settings\匿名\デベハトップ\samplestg\first.cpp' をオープンできない *** 1 errors in Compile *** ** error 1 ** deleting .\first.obj Make End !! (Elapsed time 0:00.511) エラーの意味もわからないし、ググっても解決法が分からなかったので 書き込みしました。 わかる方、解答お願い致します。

  • DxLibについて質問です

    DxLibを使ったプログラムがコンパイルできません。 下がそのプログラムです #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) { return -1; } DrawBox(100,100,300,300,GetColor(255,255,255),TRUE); WaitKey(); DxLib_End(); return 0; } http://p.booklog.jp/book/46490/chapter/77396 このサイトに従って、DXライブラリを使うセットアップをしたのですが、 下のようなエラーコードが出てきます。 ■C:\Users\masaki\Desktop\C> bcc32 windows.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland windows.cpp: 警告 W8022 C:\borland\bcc55\Include\DxDirectX.h 6121: 'D_CTransInPlaceFilter::Transform(D_IMediaSample *)' が仮想関数 'D_CTransformFilter::Transform(D_IMediaSample *,D_IMediaSample *)' を隠蔽する 警告 W8094 C:\borland\bcc55\Include\DxLib.h 100: #pragma comment( <type> [,"string"] ) の使用法に誤りがある 警告 W8094 C:\borland\bcc55\Include\DxLib.h 101: #pragma comment( <type> [,"string"] ) の使用法に誤りがある 警告 W8094 C:\borland\bcc55\Include\DxLib.h 102: #pragma comment( <type> [,"string"] ) の使用法に誤りがある 警告 W8057 windows.cpp 13: パラメータ 'hInstance' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 windows.cpp 13: パラメータ 'hPrevInstance' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 windows.cpp 13: パラメータ 'lpCmdLine' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 windows.cpp 13: パラメータ 'nCmdShow' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: ファイル SHELL32.LIB が開けません shell32.libが開けないとあり、自分でも調べたのですが、自分にはその内容が理解できず、このサイトに質問を投稿しました。 コンパイラは、Borland C++ Compiler 5.5.1 OSは、Windows 7 Ultimate エディタは、CPad for Borland C++ Compiler ver.2.3.1 です。 よろしくお願いします。

  • drand48()が使えない

    お世話になっております、皆様のおかげで昨日ウインドウズ上でCを動かせるようになったサルプログラマーです。 Borlandの無償配布をダウンロードしました。Linuxで gcc program1.c -o program1 -lm -O としてコンパイルできていたものをそのまま持ってきて(拡張子変えて)、 C:\bcc>bcc32 program1.cpp としたら Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland program1.cpp: エラー E2268 program1.cpp 61: 未定義の関数 'srand48' を呼び出した(関数 main() ) エラー E2268 program1.cpp 66: 未定義の関数 'drand48' を呼び出した(関数 main() ) *** 2 errors in Compile *** となってしまいました。 いままでプログラムの中身は ======================================================== srand48(seed); for(i=0; i<I; i++){ while(1){ do{ x=drand48()*2.0-1.0; y=drand48()*2.0-1.0; : : ======================================================== という形でLinux上ではコンパイルできてましたが、ウインドウズに持ってきたらダメでした。ある掲示板でdrand48()は非標準関数であるとありましたが、このために使えないのでしょうか?[0,1)のdoubleの乱数を返す、また質がいいからオススメと友達に言われて使っていたのです。ですから非常にいいなあと思って使っていたのですが、どうにかならないでしょうか。使えるようにするにはどうしたらよいのでしょうか、色々あるかと思いますが何か解決方法をご教授ください。

  • Emacs端末上で、Cプログラムが適切に動作しない

    こんにちは。 OSは現在、64bit版のWindows7を使っており、Emacsは、Gnu Emacs for Windows 23.4 を使っています。 Emacsのシェルモード(「M-x shell」で起動するモード)では、シェルとしてCygwinに付属しているbashを使い、C言語のソースをコンパイル(あるいはビルド)する場合は、Cygwinのgccを使おうと考えています。 ところが、ビルドしたプログラムをEmacsのシェルモードで実行すると、上手く起動しないので困っています。 具体的には、以下の通りです。 まず、テスト用のCソースファイルとして、以下のような、test.cを作成しました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { int num=2; printf"Enter integer: "); scanf("%d", &num); printf("Number enterd: %d", num); } ------------------------------------------------------------ これをシェルモードで、gccを使ってビルドし、作成されたa.exeを実行すると、以下のようになりました。 [TERM=emacs] ------------------------------------------------------------ Kei-Lavie@Kei:~/C_Programs $ gcc test2.c Kei-Lavie@Kei:~/C_Programs $ ./a.exe 20 Enter integer: Number enterd: 20 ------------------------------------------------------------ 作成された実行ファイルのa.exeを実行すると、まず Enter integer: と表示されるはずなのですが、それが表示されず、止まります。 そこで、整数として適当に20を入力してみると、 Enter integer: Number enterd: 20 と出力されました。 どうやら、必要な入力操作が終わってから、全ての出力操作が行われるようです。 その事を確認するために、先ほどのtest.cのmain関数を、以下のように変更し、数値を入力する場面を2箇所設けました。 ------------------------------------------------------------ int main(void) { int i=2; double d=0.1; printf("Enter integer: "); scanf("%d", &i); printf("Integer enterd: %d", i); printf("\n"); printf("Enter number: "); scanf("%lf", &d); printf("Number enterd: %f", d); } ------------------------------------------------------------ これをシェルモードで、gccを使ってビルドし、作成されたa.exeを実行すると、以下のようになりました。 [TERM=emacs] ------------------------------------------------------------ Kei-Lavie@Kei:~/C_Programs $ gcc test.c Kei-Lavie@Kei:~/C_Programs $ ./a.exe 20 0.123456789 Enter integer: Integer entered: 20 Enter number: Number entered: 0.123457 ------------------------------------------------------------ 作成された実行ファイルのa.exeを実行すると、まず Enter integer: と表示されるはずなのですが、それが表示されず、止まります。 そこで、整数として20を入力してみても止まったままです。 そして浮動小数点数として0.123456789を入力すると、 Enter integer: Integer entered: 20 Enter number: Number entered: 0.123457 と出力されました。 やはり、必要な全ての入力操作が終わってから、最後に全ての出力操作が行われるようです。 しかし、作成されたa.exeを、ktermといった端末上で実行すると、プログラムは以下のように適切に動作します。 [TERM=kterm] ------------------------------------------------------------ Kei@Kei-Lavie /cygdrive/c/Emacs_for_Windows/C_Programs $ ./a.exe Enter integer: 20 Integer entered: 20 Enter number: 0.123456789 Number entered: 0.123457 ------------------------------------------------------------ つまり、上記のように、作成されたプログラムが適切に動作しない問題は、Emacs端末に固有のもののようです。 上記のような問題を解決しようといろいろ試していると、kterm上で、a.exeの出力を、catやnkfといった出力コマンドにパイプすると、上記のような問題と同じ動作をしました。 具体的には以下の通りです。 [TERM=kterm] ------------------------------------------------------------ Kei@Kei-Lavie /cygdrive/c/Emacs_for_Windows/C_Programs $ ./a.exe |nkf 20 0.123456789 Enter integer: Integer entered: 20 Enter number: Number entered: 0.123457 ------------------------------------------------------------ 以上のような事から、どうやらEmacsのシェルモードでは、プログラムの出力を、catなどの出力コマンドにパイプしているのだと予想されます。 そこで、シェルモードの動作を決めると思われる、shell.el(あるいはshell.elc)やcomint.el(あるいはcomint.el)の内容を見てみたのですが、複雑すぎて、どの部分がEmacs端末上での出力に関与しているのかが分かりませんでした。 どうしてもEmacsのシェルモードを使って、C言語での開発を行いたいと思っていますので、 以上の件について、同じような経験をされた方、あるいは、何か解決策としてのご提案がある方は、是非、投稿をお願い致します。 自力では解決できそうにないので、どうか力をお貸しください。 よろしくお願い致します。

  • Borland C++ Compiler 5.5について

    Borland C++ Compiler 5.5をインストールしたんですが、なかなかうまくできません。 「bcc32.cfg」と「ilink32.cfg」 のファイルは作りました。 それにシステムのプロパティで環境変数にあるPathに 「C:\borland\bcc55\bin」 を追加したんですがコマンド プロンプトに 「bcc32 ファイル名.cpp」 って入力しても 「'bcc32'は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 とエラーメッセージが出るんです。 どうしたら良いですか?(ちなみにwinXPです)

  • DOSでコンパイルしたらインクルードファイルがない?(開けない?)

    borland c++ コンパイラ5.5をインストールして コマンドプロンプトで実行したのですが こんなメッセージがでました。どうすればよいのでしょうか? ライブラリとかいるんでしょうか? C:\borland\bcc55\Bin>bcc32 ffff.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland ffff.cpp: エラー E2209 ffff.cpp 1: インクルードファイル 'iostream.h' をオープンできない エラー E2451 ffff.cpp 5: 未定義のシンボル cout(関数 main() ) *** 2 errors in Compile *** ちなみにソースファイルの内容は以下のとおりです。 #include <iostream.h> void main(){ cout<<"ffff"; }

  • c++ , template , ファイル分割 , 助けてください...

    //-----------------coord.h------------- template <class type> class coord { type v[3]; public: coord(void); void Show(void); }; //-----------------main.cpp------------ #include<iostream> #include"coord.h" using namespace std; int main(void) { coord<double> ob; ob.Show(); return 0; } //----------------------coord.cpp----------- #include<iostream> #include"coord.h" using namespace std; template <class type> coord<type>::coord(void) { v[0]=v[1]=v[2]=0; } template <class type> void coord<type>::Show(void) { cout << "hello" << endl; } 同一フォルダ内に上記のファイルが 3 つあります. つまり上の 3 つのファイルを分割してコンパイルさせたいです. この状態で...MS-DOSプロンプトからコンパイルします. C:\test>bcc32 -c coord.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland coord.cpp: C:\test>bcc32 -c main.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland main.cpp: C:\test>bcc32 -emain main.obj coord.obj Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'coord<double>::coord<double>()' が未解決(C:\USERS\TAITO\PR OG\CPP\TEST\MAIN.OBJ が参照) Error: 外部シンボル 'coord<double>::Show()' が未解決(C:\USERS\TAITO\PROG\CPP\TE ST\MAIN.OBJ が参照) すると, このようなエラー文が出てしまい 実行可能ファイルができません. コンパイラはbccです. 原因が全く分かりません. 助けてください... ちなみに, 分割せずにコンパイルすると通ります. 自分は c 言語での分割コンパイル経験はあるので それをそのまま c++ 言語でも用いているのですが, 何か変えなければならないのでしょうか?

専門家に質問してみよう