C言語関係掲示板

過去ログ

No.545.scanf("%*s");の意味

[戻る] [ホームページ]
No.4642

Scanf()について教えてください
投稿者---ジロー(2003/01/26 23:24:42)


はじめまして!
Scanf関数で質問があります

0 : #include<stdio.h>
1 : main(){
2 : int m;
3 : do{
4 :  printf("何月ですか?\n");
5 :  if(scanf("%d",&m)!=1)
6 :    scanf("%*s");
7 :  }while(m<1||m>12);
8 : return m;
9 : }

というプログラムが雑誌に載っていたのですが
7行目の使い方がよくわかりません
なくても同じ結果が得られるんです

どなたか分かる方お願いします

No.4672

Re:Scanf()について教えてください
投稿者---ともじ(2003/01/27 16:13:01)


こんにちは。

>というプログラムが雑誌に載っていたのですが
>7行目の使い方がよくわかりません
>なくても同じ結果が得られるんです

7 :  }while(m<1||m>12);
ではなくて、
6 :    scanf("%*s");
の方ですね。

この書式指定の中に記述されている*は代入禁止文字と呼ばれます。
	do{
		printf("何月ですか?\n");
		scanf("%d",&m);
	}while(m<1||m>12);
とした場合、もしキーボードから「14aa」のように入力すると、
変数mには14が10進変換され代入されますが、「aa」の方はそのまま
入力バッファに残ります。すると、14が代入されたmは、
 }while(m<1||m>12);
を満たすので、次の入力を取りに行きます。けれども、入力バッファ
の中には先ほど残された「aa」が入っているので、10進変換できずに
そのまま再度残されます。すると、mは14のままで、
 }while(m<1||m>12);
を満たすので、次の入力を取りに行きます。・・・というように
無限ループに陥り、制御不能になります。ですから、ここで
残されてしまった「aa」のような数字以外の文字列を入力バッファから
取り出して捨てるために、scanfの戻り値が1以外の場合には、
 scanf("%*s");
としています。


No.4747

Re:Scanf()について教えてください
投稿者---ジロー(2003/01/28 21:50:13)


ご丁寧に回答していただきありがとうございました。

やっと理解できました!