6

私は C の初心者です。私の質問が不十分であっても気にしないでください。私が書いたこのプログラムでは、最初に「for」ループを使用すると、配列に格納される値は 3 つだけであると予想されますが、4 つの値が格納され、次の「for」ループでは予想どおり 3 つの値が表示されます。私の質問は、なぜ最初の 'for' ループで 3 つではなく 4 つの値を取るのですか?

#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));
    }
}
4

2 に答える 2

11

\nscanf問題がありました

#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なく数値のみを格納します。4marks[]

2 番目:i = 0ループがtoに対して 3 回だけ実行されることを理解するのは興味深いことi < 3です。for ループは条件に従って実行されます。scanf()以下に説明するよう に、さらに興味深いコードが詰まっています。

あなたの混乱は、実行4時間をループするためでscanf()はなく、非スペース文字を入力したときにのみ関数が返されるためです(そして、いくつかのenterプレスの後、非スペース文字である数字記号を入力します)。

この動作を理解するには、マニュアルを読んでください: int scanf(const char *format, ...);:

一連の空白文字 (スペース、タブ、改行など。 を参照 isspace(3))。このディレクティブ は、入力内の空白を含め、任意の量の空白に一致します

最初の for ループでは 、フォーマット文字列にscanf()含まれているため、数字(または非スペース) を押した場合にのみ返されます。\nscanf()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 
于 2013-07-24T10:19:06.870 に答える