为什么scanf要求输入两次,但仅在第一次循环迭代中?

时间:2015-06-18 16:39:30

标签: c scanf

首先,这似乎与this问题重复,但在我的情况下,为什么这只发生在第一次循环迭代中(第一个数组元素的输入)。为什么不呢?

我的代码:

#include "stdio.h"

int main(int argc, char const *argv[])
{
    int a[5];
    int i;
    for (i = 0; i < 5; i++) {
        printf("Input a[%d]:\n", i);
        int x = scanf("%d ", &a[i]);    // notice the white-space after %d
    }
    for (i = 0; i < 5; ++i)
    {
        printf("a[%d]=%d\n", i, a[i]);
    }
}

输出示例:

Input a[0]:
1
2
Input a[1]:
3
Input a[2]:
4
Input a[3]:
5
Input a[4]:
6
a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5

为什么它仅为a[0]请求输入两次,而不是其余为什么,以及为什么分配给a[1-5]的值是在它之前的一次循环迭代中输入的值?< / p>

我看了this回答,但我仍然不明白为什么它在每个循环中都没有要求输入两次。有任何明确的解释吗?

3 个答案:

答案 0 :(得分:2)

在你的情况下,

 scanf("%d ", &a[i]);
扫描整数后,scanf()需要匹配空格,任意数量的空格直到需要非白色空格字符完成比赛。

因此,第一次,第二次输入是非白色空间,它终止扫描,但留在缓冲区(仍未读取)以进行下一次扫描

下一次,最后一个输入(在缓冲区中留下)被视为扫描输入,当前输入用作终结符,只是留在缓冲区中,依此类推。

因此,最后一个输入(6)实际上从未被读入数组,仍然只是终结符。考虑连续的前五个输入。 只是为了说清楚,引用C11,章§7.21.6.2,第(5)段,强调我的

  

由白色空格字符组成的指令通过将输入 读取到第一个非空白字符(仍未读取) 来执行,或者直到找不到更多字符为止。

答案 1 :(得分:0)

@Sourav Ghosh非常好地解释了gulp default

为了澄清用户体验,棘手的附加部分是scanf()通常是行缓冲。这意味着在 Enter 或EOF发生之前,没有用户输入stdin。这就是为什么第一个stdinscanf()被输入时没有返回(2中指令" "寻求的非空白空间)。用户必须输入scanf("%d ",...输入然后 2同时输入stdin然后 "2\n"看到scanf(),将其留在2中,然后返回。

答案 2 :(得分:0)

以下代码:

1)没有引发编译器警告I.E.干净地遵守

2)使用scanf()

正确处理任何错误情况

3)用&#39; return(0);&#39;

正确处理程序退出

4)包括用于exit()和EXIT_FAILURE

的stdlib.h

5)在不使用可选参数argc和argv时正确声明main()函数。

6)使用scanf()

中的格式字符串更正问题
#include "stdio.h"
#include <stdlib.h> // exit and EXIT_FAILURE

#define MAX_A_LEN (5)

int main( void )
{
    int a[ MAX_A_LEN ];
    int i; // loop index

    for (i = 0; i < MAX_A_LEN; i++)
    {
        printf("Input a[%d]:\n", i);
        if( 1 != scanf("%d", &a[i]) )    
        { // then scanf failed
            perror( "scanf failed" );
            exit( EXIT_FAILURE );
        }

        // implied else, scanf successful
    }

    for (i = 0; i < MAX_A_LEN; ++i)
    {
        printf("a[%d]=%d\n", i, a[i]);
    }

    return(0);
} // end function: main