我是C的初学者。如果我的问题很蹩脚,请不要介意。在我编写的这个程序中,当我第一次使用'for'循环时,我预计只有3个值存储在一个数组中,但它存储了4个值,并且在下一个'for'循环中,如预期的那样显示3个值。 我的问题是为什么在1st'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));
}
}
答案 0 :(得分:11)
\n
中的{p> 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个值。我的问题是为什么 在1st'for'循环中它需要4个值而不是3个?
首先:不,它只在3
数组中存储4
个号但不包含marks[]
个号码。
第二:有趣的是,i = 0
到i < 3
的循环运行只有三次。 for循环根据条件运行。更有趣的代码卡在scanf()
中,如下所述:
你的困惑是为什么你必须输入四个数字,这不是因为你循环运行4
次,而是因为scanf()
函数只在你输入一个非空格字符时返回(并且在一些之后< kbd>输入按下你输入一个非空格char的数字符号。
要了解此行为,请参阅手册:int scanf(const char *format, ...);
:
一系列空格字符(空格,制表符,换行符等;请参阅
isspace(3)
)。该指令匹配任意数量的空白区域, 包括none,在输入中。
因为在第一个for循环中,在scanf()
中,您在格式字符串中包含了\n
,所以scanf()
仅在按下数字输入时返回(或者非空格键)。
scanf("%d\n",(marks+i));
^
|
new line char
会发生什么?
假设对程序的输入是:
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
答案 1 :(得分:0)
删除\n
并且i
可以在if语句中创建为for (int i = 0; i < 3; i++) {}