- ベストアンサー
getchar()に関する質問
- getchar()について教えてください。
- visual studio 2010 professionalでgetchar()を使用してキーボード入力を待機させる方法について教えてください。
- getchar()を1回しか使わないとキーボード入力を待機させることができない理由について教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>printf("なにか数字を入力してください。\n"); >scanf("%d",&i); この時点で「123」と入力しても、入力が終了しません。入力を終了させるには「Enter」も押さないとなりません。 Enterを押すと入力が終了し、入力した「123[Enter]」がstdin(標準入力)に送られます。 次にscanfの%dにより、stdinから「123」が取り出され、数値に変換された後、iに代入されます。 この時、stdinには「まだ取り出されていない[Enter]」が残ったままになっています。 >printf("今あなたが入力した数字は%dです。\n",i); >printf("続行するには何かキーを押してください!"); この時点でも、まだ[Enter]が残っています。 >getchar(); ここでgetcharを行うと「stdinに、まだ[Enter]が残っている」ので、それが取り出されます。なので、キー入力待ちはしません。 同じプログラムを書き換えて、getchar()を「4つ」にしてから、最初の入力で「123abc[Enter]」と打ってみましょう。すると、getcharでは「キー入力待ち」をしない筈です。 なぜなら、scanfが「123」しか使わずに「abc[Enter]」を残してしまう為、1つ目のgetcharには「a」が、2つ目には「b」が、3つ目には「c」が、4つ目には「[Enter]」が入力されてしまうからです。 scanfを使用したあとにgetcharを使用する場合は、getcharの直前に「[Enter]まで読み捨てる」と言う処理が必要になります。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
「行単位の入力」で fgets+sscanf というのはよく見るけど, まじめに考えるとこれはこれでとても難しい処理を余儀なくされるんだよね>#1. scanf("%d%*[^\n]\n",&i); で「最初から数字以外の文字を入力したとき」を問題にするだけなら返り値を見ればいい. もっとも, それでも本気でやると int f; while (f = scanf("%d", &i), scanf("%*[^\n]\n"), f == 0) { } のようにやっぱり面倒. これをやってくれるルーチンを作ればいいともいえるが, そういうルーチンを作るなら最後の「数字でない奴ら」を読み捨てない int scanInt(int *p) { int f; while ((f = scanf("%d", p)) == 0) { scanf("%*[^\n]"); } return f; } の方が (より scanf の仕様に近くて) いいような気がする.
お礼
長文の説明ありがとうございました。ご親切感謝します。
- titokani
- ベストアンサー率19% (341/1726)
#1です。 >scanf("%d%*[^\n]\n",&i); これだと、最初から数字以外の文字を入力したときにだめですね・・・すみません。 やはりエラー処理なども含めてちゃんとやりたいのであれば、fgetsで入力して、sscanfで変換するのがよいと思います。
お礼
ありがとうございました。
- titokani
- ベストアンサー率19% (341/1726)
はい、scanfが問題です。 行単位の入力であれば、fgets+sscanfを使うほうがよいです。 簡単に対応するなら、 scanf("%d ",&i); と、%dの後ろにスペースを入れてみてください。 ただ、この場合、数値の後ろに余計な文字を入れてしまうとうまくいきません。 scanf("%d%*[^\n]\n",&i); なら大丈夫かな。
お礼
親切、丁寧、細かく、かつ解りやすい説明ありがとうございました。理解できました。