首先,这似乎与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回答,但我仍然不明白为什么它在每个循环中都没有要求输入两次。有任何明确的解释吗?
答案 0 :(得分:2)
在你的情况下,
scanf("%d ", &a[i]);
扫描整数后,scanf()
需要匹配空格,任意数量的空格直到需要非白色空格字符完成比赛。
因此,第一次,第二次输入是非白色空间,它终止扫描,但留在缓冲区(仍未读取)以进行下一次扫描
下一次,最后一个输入(在缓冲区中留下)被视为扫描输入,当前输入用作终结符,只是留在缓冲区中,依此类推。
因此,最后一个输入(6
)实际上从未被读入数组,仍然只是终结符。考虑连续的前五个输入。
只是为了说清楚,引用C11
,章§7.21.6.2
,第(5)段,强调我的
由白色空格字符组成的指令通过将输入 读取到第一个非空白字符(仍未读取) 来执行,或者直到找不到更多字符为止。
答案 1 :(得分:0)
@Sourav Ghosh非常好地解释了gulp default
。
为了澄清用户体验,棘手的附加部分是scanf()
通常是行缓冲。这意味着在 Enter 或EOF发生之前,没有用户输入stdin
。这就是为什么第一个stdin
在scanf()
被输入时没有返回(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.h5)在不使用可选参数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