从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数据。