2017-07-14 10 views
0
int age, i; 
char name[10], address[10]; 
for(i=0; i<3; i++) 
{ 
    printf("Enter your name: "); 
    gets(name); 
    printf("Where do you live?"); 
    gets(address); 
    printf("What's your age? "); 
    scanf("%d", &age); 
} 

コードの2番目の反復では、実行は「あなたの名前を入力:」の部分をスキップします。どうして?反復のエラー

+0

の戻り値をチェックしgetsを取り除く - それは恐ろしく安全ではない、代わりに使用し、例えば'fgets(name、sizeof name、stdin)'これは、入力バッファ*に残っている**すべての文字を考慮しない限り、混合入力に 'scanf'を使わない理由の一番の例です(例えば、' stdin') - あなたは 'scanf("%d "、&age);' –

+0

の呼び出しの直後に*入力バッファ*に ''\ n''を残します。 –

+0

最後のscanfは' –

答えて

0

年齢を入力の最後に改行文字があります。

私はfgets()の代わりgets()を使用するためにあなたを示唆しているとage

をスキャンした後、改行文字を取り除くには、%dの後にスペースを置くことによって、年齢を読んだ後\n文字を消費します。

scanf("%d ",&age); 

fgets(name, sizeof(name), stdin); 
size_t n = strlen(name); 

if(n>0 && name[n-1] == '\n') 
{ 
    name[n-1] = '\0'; 
} 

P.S ::ので、あなたはそれを取り除く必要があるfgets()の最後に改行文字があります。

scanf("%d ", &age); 

+0

ここで何が起こっていますか? '\ n' –

+0

stdinバッファには '\ n'文字が格納されていて、'%d'で読み込まれませんので、名前を読む際に '%s'を見つけたらそれは消費され、 'name'に格納されます – Gopi

0

変更

scanf("%d", &age); 

それは、ホワイトスペース(改行)を読み取るように。

コメントで

を述べたように、 `gets`を使用しないでくださいscanf