プロが教えるわが家の防犯対策術!

scanfが使えなくて困っています。どなたか教えていただけないでしょうか(>_<

現在scanfが2つあるプログラムを作っています。

scanfのあるプログラムを実行すると入力待ち画面になりますよね。以下のプログラムを実行すると

1回目のscanfは入力待ちになるのですが2回目は入力待ちにならずに

最後まで行ってしまいます・・。

void main(){
int b;
char d, names[20];

printf("名前入力\n");
scanf("%s", &names);

printf("1文字キー入力\n");
scanf("%c", &d);

printf("\n名前は %s : キーは %c です。\n", names, d);
}

実行結果
--------------------------------------
名前入力
dra2jp
1文字キー入力

名前は dra2jp : キーは
です。

--------------------------------------

名前入力のところは入力待ちになるのですがキー入力ができずに一気に最後までいってしまい、

つまり2回入力待ちにならなければならないのに1回の入力でプログラムが終了してしまいます。

どこが間違っているのでしょうか(>_<

どなたかご指導お願いします:;

A 回答 (2件)

scanf("%s", &names); は厳密には間違いで, scanf("%s", names); ですよねと思いつつ, そのあとに


while ((c = getchar()) != '\n');
とでも書いておくのが安全じゃないでしょうか.
ちなみに fflush を stdin のような入力ストリームに対して用いるのは未定義動作なので, ポータブルなプログラムを作るときには避けるべきでしょう.
    • good
    • 3
この回答へのお礼

なんでかわからないけど
while (1){
d = getchar();
if(d=='y')
break;
}
にしたらできました^^;
お二人のご意見はごもっともだと思うのですが
while ((c = getchar()) != '\n');
とかでもうまくいかず:;
何がともあれお世話になりました!

お礼日時:2005/07/21 17:42

最初の scanf("%s", &names); で改行までの文字列が入力され、次の scanf("%c", &d); で改行文字が入力されたのでしょう。



対策方法1

scanf("%s", &names);

gets(names);

対策方法2

printf("1文字キー入力\n");

fflush(stdin);
printf("1文字キー入力\n");
    • good
    • 3
この回答へのお礼

なんでかわからないけど
while (1){
d = getchar();
if(d=='y')
break;
}
にしたらできました^^;
お二人のご意見はごもっともだと思うのですが
while ((c = getchar()) != '\n');
とかでもうまくいかず:;
何がともあれお世話になりました!

お礼日時:2005/07/21 17:42

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

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