scanf()の後にfgets()を使うとfgets()を抜けてしまう対処法

次のようなコードで、数値と文字列を入力する。

#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);

おすすめ

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください