为什么我的程序每次运行都返回第一个输入值而不返回小数点? #包括 内部主(空){ int计数,值; 双平均值,总和; 计数=0; 总和=0; printf(“请输入您有多少个整数”); scanf(“%d”、&count); for(int i=0;iscanf(“%lf”、&value)scanf(“%d”,和值)-->scanf(“%lf”、&value)
示例:计数输入为为什么我的程序每次运行都返回第一个输入值而不返回小数点? #包括 内部主(空){ int计数,值; 双平均值,总和; 计数=0; 总和=0; printf(“请输入您有多少个整数”); scanf(“%d”、&count); for(int i=0;iscanf(“%lf”、&value)scanf(“%d”,和值)-->scanf(“%lf”、&value),c,for-loop,int,scanf,C,For Loop,Int,Scanf,示例:计数输入为4。输入值为7.6,1,2,3 我知道在for循环scanf中首先看到7.6,但忽略小数点,因为它不是有效的输入形式,并在循环中的每个后续scanf中传递它,尽管他们从未真正接受输入。这将导致仅输入值为7,但程序应继续将7除以4以检索“预期”平均值,但事实并非如此。我最终得到了700万,我不知道为什么会这样 忽略我提示用户输入整数值的事实,即使输入了浮点值,因为这是我家庭作业的一部分。任何关于我应该学习的东西的提示或参考都会很好 我知道在for循环中scanf首先看到7.6,但忽
4
。输入值为7.6,1,2,3
我知道在for循环scanf
中首先看到7.6
,但忽略小数点,因为它不是有效的输入形式,并在循环中的每个后续scanf
中传递它,尽管他们从未真正接受输入。这将导致仅输入值为7,但程序应继续将7除以4以检索“预期”平均值,但事实并非如此。我最终得到了700万,我不知道为什么会这样
忽略我提示用户输入整数值的事实,即使输入了浮点值,因为这是我家庭作业的一部分。任何关于我应该学习的东西的提示或参考都会很好
我知道在for循环中scanf首先看到7.6,但忽略小数点[…]
否。这是匹配失败,因为您输入的输入(7.6
)与格式说明符%d
不匹配。因此,scanf()
失败。这就是为什么您应该始终检查所有标准函数的返回代码。看
如果您希望能够读取浮点值,那么您应该读取(更改代码)以读取浮点(或双精度)
例如,要读取一个双精度:
#include <stdio.h>
int main (void) {
int count, value;
double avg, sum;
count = 0;
sum = 0;
printf("please input how many integers you have \n");
scanf("%d", &count);
for (int i = 0; i < count; i++) {
printf("please input your values \n");
scanf("%d", &value);
sum = sum + value;
}
avg = sum / count;
printf("your average is " "%f", avg);
}
一般建议:尽可能不要使用scanf()
。请阅读进一步解释
我知道在for循环中scanf首先看到7.6,但忽略小数点[…]
否。这是匹配失败,因为您输入的输入(7.6
)与格式说明符%d
不匹配。因此,scanf()
失败。这就是为什么您应该始终检查所有标准函数的返回代码。看
如果您希望能够读取浮点值,那么您应该读取(更改代码)以读取浮点(或双精度)
例如,要读取一个双精度:
#include <stdio.h>
int main (void) {
int count, value;
double avg, sum;
count = 0;
sum = 0;
printf("please input how many integers you have \n");
scanf("%d", &count);
for (int i = 0; i < count; i++) {
printf("please input your values \n");
scanf("%d", &value);
sum = sum + value;
}
avg = sum / count;
printf("your average is " "%f", avg);
}
一般建议:尽可能不要使用scanf()
。请阅读进一步解释。您的推理似乎是正确的,除了假设scanf
将在后续迭代中将值设置为零。相反,在读取第一次迭代的周期并将7分配给value
之后,在随后的迭代中scanf
将看到周期,得出输入与格式不匹配的结论,并且根本不触摸value
,在每次迭代中将其保留为7。(第一次迭代应返回1,后续迭代应返回0,以指示匹配和分配的项目数)
因此,循环将在每次迭代中添加7,然后除以迭代次数,得到7的结果。您的推理似乎是正确的,除了假设scanf
将在后续迭代中将值设置为零。相反,在读取第一次迭代的周期并将7分配给value
之后,在随后的迭代中scanf
将看到周期,得出输入与格式不匹配的结论,并且根本不触摸value
,在每次迭代中将其保留为7。(第一次迭代应返回1,后续迭代应返回0,以指示匹配和分配的项目数)
因此,循环将在每次迭代中添加7,然后除以迭代次数,得到7的结果。scanf(“%d”,&value)代码>-->scanf(“%lf”、&value)代码>scanf(“%d”,和值)代码>-->scanf(“%lf”、&value)我不是语言律师,但我很确定这不是未定义的行为。如果变量的类型与格式说明符不匹配,则可以,但格式说明符是%d
,类型是int
。在我看来,与给定格式不匹配的输入只会导致匹配失败,并使scanf
以较小的返回值提前返回-在这种情况下,在第一次时,它应该与时段匹配。(如果你不同意,我非常希望有一个指针指向标准中应该使其未定义的部分)我不是语言律师,但我很确定这不是未定义的行为。如果变量的类型与格式说明符不匹配,则可以,但格式说明符是%d
,类型是int
。在我看来,与给定格式不匹配的输入只会导致匹配失败,并使scanf
以较小的返回值提前返回-在这种情况下,在第一次时,它应该与时段匹配。(如果您不同意,我非常希望有一个指针指向标准中可能使其未定义的部分)感谢您的评论,这确实是一个匹配失败(这不是未定义的行为)。我被纠正了+1.感谢您的评论,这确实是一个匹配的失败(这不是未定义的行为)。我被纠正了+1.