从input数组中存储数据

我是C的初学者。请不要介意我的问题是否是跛脚。 在我编写的这个程序中,当我第一次使用'for'循环时,我期望只有3个值被存储在一个数组中,但是它存储了4个值,并且在下一个for循环中如预期的那样显示了3个值。 我的问题是为什么在第一个“for”循环中需要4个值而不是3个?

#include<stdio.h> void main() { int marks[3]; int i; for(i=0;i<3;i++) { printf("Enter a no\n"); scanf("%d\n",(marks+i)); } for(i=0;i<3;i++) { printf("%d\n",*(marks+i)); } } 

\n scanf中的问题是这个问题

 #include<stdio.h> int main() { int marks[3]; int i; for(i=0;i<3;i++) { printf("Enter a no\n"); scanf("%d",(marks+i)); } printf("\nEntered values:\n"); for(i=0;i<3;i++) { printf("%d\n",*(marks+i)); } return 0; } 

原因:

我期望只有3值存储在一个数组,但它存储4个值,并在下一个'for'循环如预期显示3个值。 我的问题是为什么在第一个“for”循环中需要4个值而不是3个?

第一:不,它只在数组marks[]存储3数字,而不是4数字。

第二:有趣的理解循环运行只有三次为i = 0i < 3 。 for循环根据条件运行。 更有趣的代码卡在scanf() ,如下所述:

你的困惑是为什么你必须input四个数字,不是因为循环运行了4次,而是因为scanf()函数只有在input非空格字符时才返回scanf()在input一个非数字字符后按下input的数字符号是非 – 空格字符)。

为了理解这个行为,请阅读手册: int scanf(const char *format, ...);

一系列空白字符(空格,制表符,换行符等;请参阅isspace(3) )。 该指令匹配input中的任意数量的空白,包括无

因为在第一个for循环中,在scanf()你已经在格式化string中包含了\n ,所以只有在按下数字input (或非空格 )时, scanf()才会返回。

  scanf("%d\n",(marks+i)); ^ | new line char 

怎么了?

假设对程序的input是:

 23 <--- because of %d 23 stored in marks[0] as i = 0 <enter> <--- scanf consumes \n, still in first loop 543 <--- scanf returns, and leave 542 unread, then in next iteration 543 read by scanf in next iteration <enter> 193 <enter> <--- scanf consumes \n, still in 3rd loop <enter> <--- scanf consumes \n, still in 3rd loop 123 <--- remain unread in input stream 

删除\ni可以在if语句中创buildfor (int i = 0; i < 3; i++) {}

在数组中,从0开始计数

 for(i=0;i<3;i++) 

这里我<2为正确的input数据。