\n
#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;
}
理由問題であった: '
Iのみ3
値を期待がアレイに記憶されているが、それは4つの値 を格納し、次にfor 'loop as expected'は3つの値を示します。私の質問はなぜ が1回目の 'for'ループで3の代わりに4つの値を取るのですか?
まず:いいえ、それだけで店舗3
数が、配列marks[]
ではない4
番号。
i = 0
からi < 3
のループを3回だけ実行するのは興味深いことです。 forループは条件に従って実行されます。後述のようにもっと面白いコードがscanf()
で立ち往生されています
あなたは4つの数字を入力する必要がなぜループが4
回実行されるため、しかし、あなたは非空白文字を入力した場合にのみ、そのscanf()
関数は(返すのであなたの混乱は、そのではありませんの後にを入力すると、空白以外の文字である数字記号が入力されます。 int scanf(const char *format, ...);
:
空白文字の列(スペース、タブ、改行などは; isspace(3)
参照)、この動作を理解するために
は、取扱説明書をお読みください。このディレクティブは、入力なしで入力した の空白に一致します。入力はです。
ので、ループのための第一に、scanf()
にあなたはフォーマット文字列で\n
が含まれている、これだけ押すとscanf()
リターンは数は(または非スペースキー)を入力します。
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
としてif文で作成することができます '、ボイドmain'は法的ではありません。 'int main'を使います。 – chris
scanfで '\ n'を取り除く –