从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 = 0
到i < 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
删除\n
, i
可以在if语句中创buildfor (int i = 0; i < 3; i++) {}
在数组中,从0开始计数
for(i=0;i<3;i++)
这里我<2为正确的input数据。