2015-06-18 36 views
1

首先,这似乎与this问题重复,但在我的情况下,为什么这只发生在第一次循环迭代(第一个数组元素的输入)。为什么不是所有?为什么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]的值是在它之前的一个循环迭代中输入的值?

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

+1

'的scanf( “%d ”' - >'的scanf(“ %d”'(降空间)的额外空间告诉'scanf()'继续查找,直到检测到非空格为止。 – chux

+0

请不要使用'scanf()'。**使用非常困难,而且**会导致细微的,难以如果你想从标准输入中得到每行一个项目,可以使用'fgets()'来代替。 –

+0

@TheParamagneticCroissant:你可能对'scanf()'和'fgets()'是正确的,但我是试图了解这里的微妙,难以追踪的错误:) – theman

回答

2

在你的情况,

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

扫描整数,scanf()需要匹配一个非空白字符才能完成的空白,以及任意数量的空格直到比赛。

因此,对于第一次,第二输入是所述非白色空间,这会终止扫描,但留在缓冲器(未读保持)用于下一扫描

下一次起,最后输入(留在缓冲区)被认为是扫描输入,和当前输入工作为终结,刚要留在缓冲区等。

因此,最后一个输入(6)从未实际读入阵列,而仅仅保留为终止符。连续的前五个输入被考虑。 只是要清楚,从C11,章§7.21.6.2,第(5)报价,重点煤矿

的空白字符(S)组成的指令被读取输入到执行第一个非空白字符(仍未读取),或直到不能再读取字符。

+0

非常感谢!如果我只知道“第二个输入是非空白区域,它终止扫描,但留在缓冲区(仍未读取)”,我本可以回答这个问题。那么,您能否给我一些标准文档或任何其他文章中的参考资料来解释输入/输出缓冲区如何工作? – theman

0

@Sourav Ghosh很好地解释了关于scanf()

为了阐明用户体验,棘手的附加部分是stdin通常是行缓冲。这意味着没有用户输入stdin,直到输入或发生EOF。这就是为什么当输入2(指令" "scanf("%d ",...中寻求的非空格)时,第一个scanf()未返回。用户必须键入2输入,然后stdin得到"2\n"然后scanf()看到2,使其在stdin中未读,然后返回。

0

以下代码:

1)没有提出编译警告I.E.符合干净

2)适当地处理与scanf()的任何错误条件

3)适当地处理与程序退出 '返回(0);'

4)包括用于出口()和EXIT_FAILURE

5 stdlib.h中)正常声明main()函数时不使用可选参数argc和argv。

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 
相关问题