\n
にscanf
問題がありました
#include<stdio.h>
int main()
{
int marks[3];
int i;
for(i=0;i<3;i++)
{
printf("Enter a no\n");
scanf("%d",(marks+i));
}
printf("\nEntered values:\n");
for(i=0;i<3;i++)
{
printf("%d\n",*(marks+i));
}
return 0;
}
理由:
値のみ3
が配列に格納されると予想されますが、4 つの値が格納され、次の「for」ループでは予想どおり 3 つの値が表示されます。私の質問は、なぜ最初の 'for' ループで 3 つではなく 4 つの値を取るのですか?
最初: いいえ、配列には数値では3
なく数値のみを格納します。4
marks[]
2 番目:i = 0
ループがtoに対して 3 回だけ実行されることを理解するのは興味深いことi < 3
です。for ループは条件に従って実行されます。scanf()
以下に説明するよう に、さらに興味深いコードが詰まっています。
あなたの混乱は、実行4
時間をループするためでscanf()
はなく、非スペース文字を入力したときにのみ関数が返されるためです(そして、いくつかのenterプレスの後、非スペース文字である数字記号を入力します)。
この動作を理解するには、マニュアルを読んでください: int scanf(const char *format, ...);
:
一連の空白文字 (スペース、タブ、改行など。 を参照
isspace(3)
)。このディレクティブ は、入力内の空白を含め、任意の量の空白に一致します。
最初の for ループでは 、フォーマット文字列にscanf()
含まれているため、数字(または非スペース) を押した場合にのみ返されます。\n
scanf()
enterkey
scanf("%d\n",(marks+i));
^
|
new line char
何が起こるのですか?
プログラムへの入力が次のとおりであるとします。
23 <--- because of %d 23 stored in marks[0] as i = 0
<enter> <--- scanf consumes \n, still in first loop
543 <--- scanf returns, and leave 542 unread,
then in next iteration 543 read by scanf in next iteration
<enter>
193
<enter> <--- scanf consumes \n, still in 3rd loop
<enter> <--- scanf consumes \n, still in 3rd loop
123 <--- remain unread in input stream