2013-07-24 10 views
6

私は初心者です。私の質問が不十分であれば気をつけてください。私が書いたこのプログラムでは、初めて 'for'ループを使うと、3つの値だけが配列に格納されますが、4つの値が格納され、次の 'for'ループには期待通りの3の値が格納されます。 私の質問はなぜ1の 'for'ループで3の代わりに4つの値を取るのですか? scanfデータを入力から配列に格納

#include<stdio.h> 
void main() 
{ 
    int marks[3]; 
    int i; 

    for(i=0;i<3;i++) 
    { 
     printf("Enter a no\n"); 
     scanf("%d\n",(marks+i)); 
    } 
    for(i=0;i<3;i++) 
    { 
     printf("%d\n",*(marks+i)); 
    } 
} 
+2

としてif文で作成することができます '、ボイドmain'は法的ではありません。 'int main'を使います。 – chris

+4

scanfで '\ n'を取り除く –

答えて

11

\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 
+0

これはDXですが、scanfで%dの後に\ nを使用した場合、iの値が0のときは最初に2つの値が取られますが、iの値が1と2になると、これが起こる? – ranaarjun

+1

これはhttp://answers.yahoo.com/question/index?qid=20110801122000AA07FO8でご覧になることをお勧めします。これはあなたに正確な理由があります。 –

+1

@GrijeshChauhanそれはすべてにとって有益でしょう:) –

0

\n を削除し、ifor (int i = 0; i < 3; i++) {}

関連する問題