次のようなコードで、数値と文字列を入力する。
#include
int main(){
int num;
char ch,str[5];
printf("num: ");
scanf("%d",&num);
printf("num= %d\n\n",num);
printf("str: ");
fgets(str,sizeof(str),stdin);
printf("str= \"%s\"\n",str);
return 0;
}
実行すると次のようになる。
num: 10
num= 10
str: str= "
"
数値をscanfで読み込むとき、数値の後の文字列(改行を含む)はバッファに残ります。すぐ後に文字列を読み込もうとすると、バッファに残った文字列(ここでは改行)をまず読んでしまうので、期待する結果になりません。
この現象の起きるパターンは決まっています。scanf()実行後に、getchar()や、gets()や、scanf()の%c変換のような、バッファにあるものをそのまま読み込む動作をしたときに起きます。
fgets()を使う今回の例も、このパターンに当てはまります。「scanf("%d%*c",&num);」あるいは「scanf("%d",&num); getchar();」とすれば改行を読み捨てるので問題は解決します。
gets()は危険だということで下記を書く。
printf("num: ");
scanf("%d",&num);
while((ch=fgetc(stdin))!='\n') {};
printf("num= %d\n\n",num);
printf("str: ");
fgets(str,sizeof(str),stdin);
printf("str= \"%s\"\n",str);