• ベストアンサー
  • すぐに回答を!

scanfの\nの意味

  • 質問No.9629634
  • 閲覧数218
  • ありがとう数4
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 81% (286/349)

タイトルの通りです。

#include<stdio.h>

struct Person{
char name[100];
char gender;
int age;
};

int main(void)
{

struct Person person1;

printf("名前は:");
scanf("%s",person1.name);
printf("\n年齢は:");
scanf("%d",&person1.age);
printf("\n性別は:");
scanf("\n%c",&person1.gender);
printf("\n{name=%s,age=%d,gender=%c}",person1.name,person1.age,person1.gender);

return 0;
}

上記において aaa , 11 , M と入力すると
{name=aaa,age=11,gender=M}
と表示されますが、
scanf("\n%c",&person1.gender);

scanf("%c",&person1.gender);
に変えると
{name=aaa,age=11,gender=
}
となってしまいます。

この理由と、/nの意味を教えてください。

質問者が選んだベストアンサー

  • 回答No.3
  • ベストアンサー

ベストアンサー率 66% (391/590)

https://www.sejuku.net/blog/24965#i-5

が参考になるかと。

要するに、
・一回目のscanf()に入力した後には、最後の改行コード(<enter>したというコード)が
 まだバッファに残っている
・2回目のscanf()では、上記の通りバッファの頭に改行コードが残っているけど、
 "%d"や"%s"であればそれを自動的に読み飛ばしてくれている
・3回目のscanf()でも同様に、2回目に入力した最後の改行コードが
 バッファの頭に残っているが、scanf("%c",...);だとそれをそのまま読み込むので  
 入力した'M'でなく、 バッファに残った' \n'を ..genderに入れてしまう。

このため、2回目以降でscanf("%c", ...)とする場合は、 
 "%c"でなく、 "\n%c" とか、"%*c%c" とやって、
バッファに残っている前回の改行コードを 読み飛ばしてやる必要がある。

っ感じです。
お礼コメント
hirapiro

お礼率 81% (286/349)

なるほど!理解できました!
そこで、%d、%sなら読み飛ばす、%cは読み飛ばさない、というのが仕様ということですね。
よくわかりました、ありがとうございます!!
投稿日時:2019/06/28 13:37

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 61% (264/426)

> \nがあると、改行を読み飛ばすということですが、
> gender=M
> には改行が含まれていないと思うのですが?

そこじゃなく一つ前の %d で 11<enter> って入力する想定なんでしょう?
その <enter> が次の %c に入ってきてる。

> そして、なぜnameには改行が含まれていないのでしょうか?

%c と %s の処理の違い。簡単に言えば %c は文字種を問わず次の一文字、%s は前後のホワイトスペーススキップして一単語、詳しくは scanf() の仕様を確認
お礼コメント
hirapiro

お礼率 81% (286/349)

すいません、さっぱりわからないです・・・
入力に<enter>が含まれているというのはご指摘で理解しましたが、それが%c、%d、%sでどう処理され、どう違うのかがわからないです。
仕様をネットで検索しても、これについての記述を見つけることができるませんでした。
投稿日時:2019/06/28 02:16
  • 回答No.1

ベストアンサー率 17% (221/1288)

/nは改行。
scanf("\n%c",&person1.gender);だと最初の改行文字は読み飛ばしますが
scanf("%c",&person1.gender);だと改行文字が読み込まれてしまいます。
お礼コメント
hirapiro

お礼率 81% (286/349)

ご回答ありがとうございます。
\nがあると、改行を読み飛ばすということですが、
gender=M
には改行が含まれていないと思うのですが?
そして、なぜnameには改行が含まれていないのでしょうか?
投稿日時:2019/06/27 19:23
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ