从输入中将数据存储在数组中

时间:2013-07-24 10:14:22

标签: c arrays

我是C的初学者。如果我的问题很蹩脚,请不要介意。在我编写的这个程序中,当我第一次使用'for'循环时,我预计只有3个值存储在一个数组中,但它存储了4个值,并且在下一个'for'循环中,如预期的那样显示3个值。 我的问题是为什么在1st'for'循环中它需要4个值而不是3个?

#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 个答案:

答案 0 :(得分:11)

\n中的{p> 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个值。我的问题是为什么   在1st'for'循环中它需要4个值而不是3个?

首先:不,它只在3数组中存储4个号但不包含marks[]个号码。

第二:有趣的是,i = 0i < 3的循环运行只有三次。 for循环根据条件运行。更有趣的代码卡在scanf()中,如下所述:

你的困惑是为什么你必须输入四个数字,这不是因为你循环运行4次,而是因为scanf()函数只在你输入一个非空格字符时返回(并且在一些之后< kbd>输入按下你输入一个非空格char的数字符号。

要了解此行为,请参阅手册:int scanf(const char *format, ...);

  

一系列空格字符(空格,制表符,换行符等;请参阅   isspace(3))。该指令匹配任意数量的空白区域,   包括none,在输入中。

因为在第一个for循环中,在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 

答案 1 :(得分:0)

删除\n 并且i可以在if语句中创建为for (int i = 0; i < 3; i++) {}