みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

scanfの\nの意味

タイトルの通りです。

#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の意味を教えてください。

投稿日時 - 2019-06-27 17:23:47

QNo.9629634

すぐに回答ほしいです

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

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" とやって、
バッファに残っている前回の改行コードを 読み飛ばしてやる必要がある。

っ感じです。

投稿日時 - 2019-06-28 11:55:46

お礼

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

投稿日時 - 2019-06-28 13:37:05

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

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

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

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

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

投稿日時 - 2019-06-27 21:58:07

お礼

すいません、さっぱりわからないです・・・
入力に<enter>が含まれているというのはご指摘で理解しましたが、それが%c、%d、%sでどう処理され、どう違うのかがわからないです。
仕様をネットで検索しても、これについての記述を見つけることができるませんでした。

投稿日時 - 2019-06-28 02:16:18

ANo.1

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

投稿日時 - 2019-06-27 17:29:23

お礼

ご回答ありがとうございます。
\nがあると、改行を読み飛ばすということですが、
gender=M
には改行が含まれていないと思うのですが?
そして、なぜnameには改行が含まれていないのでしょうか?

投稿日時 - 2019-06-27 19:23:42