HDOJ2006 求奇数的乘积,(C语言)关于循环中存在scanf函数,使用getchar吸收回车或空格
源代码:#include<stdio.h>intmain(void){intmulti,i,j,n;inta[50];while(scanf("%d",&n)!=EOF)...
源代码:
#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每次循环吸收一次上一次循环输入数据时遗留回车?两者的区别在哪里呢? 展开
#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每次循环吸收一次上一次循环输入数据时遗留回车?两者的区别在哪里呢? 展开
1个回答
展开全部
楼主需要了解一下scanf的具体实现。
1、对于%d,scanf会从缓冲区里面接收数字类型,然后碰到空白字符结束,将接收的字符转换成数字赋值给对应的变量,如果有连续的空白字符,会一直跳过,直到找到非空白字符开始。
2、对于%c,scanf会从缓冲区里面接收任何类型,不管是空白字符还是非空白还是非空白字符,都是字符类型,然后赋值给对应的变量。
题目里面都使用%d来接收,会自动跳过空白字符,所以不需要getchar来吸收空格。
如果题目里面先使用%d来接收一个数字,再使用%c来接收一个字符的话,那就需要用getchar来吸收%d和%c之间的空白字符了。
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导致的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询