为什么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