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

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

我的代码:

#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]的值是在它之前的一次循环迭代中输入的值?

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

在你的情况下,

  scanf("%d ", &a[i]); 

扫描整数后, scanf()需要匹配空格和任意数量的空格, 直到完成匹配需要非空格字符。

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

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

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

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

@Sourav Ghosh非常好地解释了scanf()

为了澄清用户体验,棘手的附加部分是stdin通常是行缓冲的 。 这意味着在Enter或EOF发生之前,没有任何用户键入stdin 。 这就是为什么第一个scanf()在键入2时没有返回(在scanf("%d ",... )中由指令" "寻找的非白色空间scanf("%d ",... )用户必须键入2输入然后是 stdin得到两个"2\n"然后 scanf()看到2 ,在stdin保持未读,然后返回。

以下代码:

1)不提出编译器警告IE符合要求

2)使用scanf()正确处理任何错误情况

3)用’return(0);’正确处理程序退出

4)包括用于exit()和EXIT_FAILURE的stdlib.h

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

6)用scanf()中的格式字符串纠正问题

 #include "stdio.h" #include  // 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