6

我是 C 的初学者。如果我的问题很蹩脚,请不要介意。在我编写的这个程序中,当我第一次使用“for”循环时,我希望只有 3 个值存储在一个数组中,但它存储了 4 个值,并且在下一个“for”循环中按预期显示 3 个值。我的问题是为什么在第一个“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));
    }
}
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”循环中需要 4 个值而不是 3 个?

第一: 不,它只存储3数字而不是4数组中的数字marks[]

第二:有趣的理解循环只运行了三次 for i = 0to i < 3。for 循环根据条件运行。更有趣的代码scanf()如下所述:

您的困惑是为什么您必须输入四个数字,这不是因为您循环运行4时间,而是因为scanf()函数仅在您输入非空格字符时返回(并且在按下一些enter键后您输入了一个非空格字符的数字符号)。

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

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

因为在第一个 for 循环中, scanf()您已经包含\n在格式字符串中,所以scanf()只有在按数字enter(或非空格key)时才返回。

 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 回答
0

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

于 2017-05-24T03:48:14.927 回答