C言語関係掲示板

過去ログ

No750 scanfの書式文字列内に"\n"を含むと

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

おかしいんです
投稿者---かおり(2003/09/16 17:50:06)


構造体配列変数に入力できるのですがなぜか私が入力したい個数より1個多く入力できるようになります。でも出力は入力した数より1個少ないんです。作ったプログラムは以下です。初歩的なことですいませんがどうしてなんでしょうか??
#include<stdio.h>
void main(void)
{
struct hyou{
char name[20];
int age;
int salary;
};
static struct hyou a[20];
int n;
printf("入力してください\n");
for(n=0;n<2;n++){
scanf("%s %d %d\n",a[n].name,&a[n].age,&a[n].salary);
}
for(n=0;n<2;n++){
printf("%s %d %d\n",a[n].name,a[n].age,a[n].salary);
}
}


No.9335

Re:おかしいんです
投稿者---たか(2003/09/16 19:06:21)


scanf("%s %d %d\n") の、"\n" は入力した改行文字とはマッチしません。
というのは2つめの%dでバッファに"\n"を見つけた時点でscanf()を終了し
てしまうからです。

2度目の入力で1度目にバッファに残っている"\n"を1度目の"\n"と
マッチし、それから二度目の入力が始まります。3度目は何か適当な
文字列さえ入力すれば、バッファに残った"\n"と2度目の"\n"がマッチし
て入力を終えます。

これを防ぐには、scanf()の書式文字列の中に"\n"を入れない事です。
入れなければ"\n"はホワイトスペース文字ですので勝手にスキップされ
ます。

#include<stdio.h>

int main(void)
{
  struct hyou {
    char name[20];
    int age;
    int salary;
  };
  static struct hyou a[20];
  int n;

  printf("入力してください\n");
  for (n = 0; n < 2; n++)
    scanf("%s %d %d",a[n].name,&a[n].age,&a[n].salary);

  for (n = 0; n < 2; n++)
    printf("%s %d %d\n",a[n].name,a[n].age,a[n].salary);

  return 0;
}


No.9337

Re:おかしいんです
投稿者---かずま(2003/09/16 20:17:47)


> scanf("%s %d %d\n") の、"\n" は入力した改行文字とはマッチしません。
> というのは2つめの%dでバッファに"\n"を見つけた時点でscanf()を終了し
> てしまうからです。

"\n" を見つけたところでは、scanf は終了しません。

2つめの "%d" で入力の "\n" を見つけた時点で、"%d" による読み込みは終了
しますが、scanf は、読み込み過ぎた "\n" を入力バッファに戻し、次の書式
文字 "\n" の処理に進みます。これは、連続する空白類文字を読み飛ばせ、と
いう指令ですから、入力の改行文字 "\n" を読み飛ばし、さらに次の文字を読
み込もうとします。バッファにはもう文字がありませんから、さらにユーザが
次の行を入力するのを待ちます。

次の行が入力され、その先頭の文字が空白類文字でない場合、書式の "\n"
による読み込みが終了し、読み込み過ぎた先頭文字を入力バッファに戻して
ここで、はじめて scanf が終了します。

次に scanf が呼び出されると、入力バッファには、すでに次の 1行が入って
いるので、"%s %d %d" に対応する 3つの項目は読み込まれますが、書式の最
後の "\n" の処理のため、3行目の入力をユーザに要求します。

No.9339

Re:おかしいんです
投稿者---たか(2003/09/16 20:37:34)


>"\n" を見つけたところでは、scanf は終了しません。

あっそうでした^_^;済みません。
これと全く同じ質問がBBSでもありましてその時はちゃんと答えていた
のですが・・・・・頭に"\n"がある場合とか、いろいろ試してみたん
ですけど、また忘れてしまったようです。

どちらにしろそれからscanf()の書式文字列内に" "以外のホワイト
スペース文字を入れるのをやめました。

No.9338

Re:おかしいんです
投稿者---かおり(2003/09/16 20:18:49)


どうもありがとうございました。頑張ります。