HDOJ2006 求奇数的乘积,(C语言)关于循环中存在scanf函数,使用getchar吸收回车或空格

源代码:
#include <stdio.h>
int main(void)
{ int multi,i,j,n;
int a[50];
while (scanf ("%d",&n)!=EOF)
{ //初始化数组
multi=1;
for (i=0;i<n;i++)
{
scanf ("%d",&a[i]);
}
//计算
for (j=0;j<n;j++)
{
if (a[j]%2)
{
multi*=a[j];
}
}
//输出
printf ("%d\n",multi);
}

return 0;
}

输入样例:3 1 2 3
输出样例:3
请问在遍历数组初始化的循环里,为什么不需要在scanf前加一个getchar来吸收空格?为什么在其他的oj题里,while (scanf("%d",n)!=EOF){},{}里面需要用getchar每次循环吸收一次上一次循环输入数据时遗留回车?两者的区别在哪里呢?

楼主需要了解一下scanf的具体实现。

1、对于%d,scanf会从缓冲区里面接收数字类型,然后碰到空白字符结束,将接收的字符转换成数字赋值给对应的变量,如果有连续的空白字符,会一直跳过,直到找到非空白字符开始。

2、对于%c,scanf会从缓冲区里面接收任何类型,不管是空白字符还是非空白还是非空白字符,都是字符类型,然后赋值给对应的变量。

题目里面都使用%d来接收,会自动跳过空白字符,所以不需要getchar来吸收空格。

如果题目里面先使用%d来接收一个数字,再使用%c来接收一个字符的话,那就需要用getchar来吸收%d和%c之间的空白字符了。追问

那请问根据输入样例:3 1 2 3来说,是不是可以理解为:第一遍循环,“1 ”被吸收,空格作为1这个%d的结束标志已经被使用,然后第二遍循环scanf是从2开始接收的,接收了2跟第二个空格?

追答

不是的,第一次scanf,碰到了3,然后碰到了空白字符(空格),结束,将3接收进来。

第二次scanf,上来就是空白字符(空格),由于需要的是%d,则跳过,又碰上了1,又碰到了空白字符(空格),结束,将1接收进来。

以此类推。是由于%d导致的空白字符在第二次scanf的时候被跳过,并不是第一次scanf导致的。

追问

也就是说scanf在以%d标识读取缓冲区里的数据的时候,读到空白字符为止停止,将此次的数据吸收(但不包括读到的空白字符),然后下一次scanf还是从这次读到的这个空白字符开始读取?
还有请问空白字符指的是\n,\t,跟空格吗?

追答

对,回车,TAB,空格都是空白字符。

追问

谢谢

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网