这本来只是一个很简单的题目,但是对于初学者的我来说却偶然发现了这个不同:
题目:编写一个程序,输入学生人数和每个人的成绩,计算平均成绩。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 0, i=1;
double s = 0.00, c = 0.00, b = 0.00;
scanf("%d", &a);
if (a <= 0)
{
printf("the number of students:0\nthe scores:average=0.00");
}
else
{
for (i = 1; i <= a; i++)
{
scanf("%lf ", &b);//此处若是写为scanf(" %lf",&b)则可以直接运行成功,但是如果像原代码一样空格放在%lf后面,则要按照下图所示的方式输入,原因见下。(实际不建议按照该代码来写,容易输出错位,产生bug,更推荐的代码见下)
s += b;
}
printf("the number of students:%d\nthe scores:%.2f\naverage:%.2f", a, s, s/a);
}
return 0;
}
原因:输入数据后必须敲回车,数据才可以成功来到输入缓冲区。空格也是一个隔断符
①如果是%d%d或者%f%f这样紧挨着的,在输入数据时可以以任何空白字符作为分隔标志(包括空格,回车,水平制表符),并且不限数量。因为scanf在提取整形数据时会自动吞掉%d前所有的空白字符(包括空格,回车,水平制表符),直到提取到%d类型的整形数据。
②如果在%d后面加上空格,在%d匹配完所有数据后,%d后面的空白字符开始工作,它会丢掉缓冲区中%d后所有的空格,回车,水平制表符,所以无论我们输入多少次回车都会被%d后面的空白字符吞掉,要想停下来,就需要输入一个非空白字符。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 0, i=1;
double s = 0.00, c = 0.00, b = 0.00;
scanf("%d", &a);
if (a <= 0)
{
printf("the number of students:0\nthe scores:average=0.00");
}
else
{
for (i = 1; i <= a; i++)
{
scanf(" %lf", &b);
s += b;
}
printf("the number of students:%d\nthe scores:%.2f\naverage:%.2f", a, s, s/a);
}
return 0;
}