アプリ版:「スタンプのみでお礼する」機能のリリースについて

visual studio 2010 professinalで以下のソースをデバッグして

”続行するには何かキーを押してください!”
 で待機させたいのですが getchar()一個だけでは実現しません。 
 2個重ねるとOKです。どうしてでしょうか。
 -------------- 以下のようにscanf関数がなければokということは突き止めたのですが、、、。
 ご教授ください。

#include <stdio.h>
int main(void)
{ int i;
printf("なにか数字を入力してください。\n");
scanf("%d",&i);
printf("今あなたが入力した数字は%dです。\n",i);
printf("続行するには何かキーを押してください!");
getchar();
//getchar();
return 0;
}

----------------------------------------------------------------
int main(void)
{
printf("続行するには何かキーを押してください!");
getchar();
  return 0;
}

A 回答 (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]まで読み捨てる」と言う処理が必要になります。
    • good
    • 1
この回答へのお礼

親切、丁寧、細かく、かつ解りやすい説明ありがとうございました。理解できました。

お礼日時:2011/01/14 17:45

「行単位の入力」で 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 の仕様に近くて) いいような気がする.
    • good
    • 0
この回答へのお礼

長文の説明ありがとうございました。ご親切感謝します。

お礼日時:2011/01/14 17:49

#1です。


>scanf("%d%*[^\n]\n",&i);
これだと、最初から数字以外の文字を入力したときにだめですね・・・すみません。
やはりエラー処理なども含めてちゃんとやりたいのであれば、fgetsで入力して、sscanfで変換するのがよいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/01/14 17:43

はい、scanfが問題です。


行単位の入力であれば、fgets+sscanfを使うほうがよいです。
簡単に対応するなら、
scanf("%d ",&i);
と、%dの後ろにスペースを入れてみてください。

ただ、この場合、数値の後ろに余計な文字を入れてしまうとうまくいきません。

scanf("%d%*[^\n]\n",&i);

なら大丈夫かな。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています