代码::当我在这个简单的代码中输入第一个分数时,块不断崩溃。对我来说,这是一个完美的类型代码,现在我很困惑。
#include <stdio.h>
#include <stdlib.h>
int main() {
float grade = 0;
float scoreEntered = 0;
float numtest = 0;
float average = 0;
printf("Press 0 when complete. nn");
do {
printf("Test: %.0f Average: %.2f n", numtest, average);
printf("nEnter test score ");
scanf("%f", scoreEntered);
grade += scoreEntered;
numtest++;
average = grade / numtest;
} while (scoreEntered != 0);
return 0;
}
scanf("%f", scoreEntered);
应该是
scanf("%f", &scoreEntered);
scanf
期望变量的地址,当你传递变量而不是变量的地址时,它最终会访问无效的内存,导致段错误
您的错误在第 16 行
它应该是
scanf("%f", &scoreEntered);
原因
">&"用于获取变量的地址,"scanf(("需要变量的地址来存储数据
问题是您传递scanf()
的是scoreEntered
的值而不是其地址。 你应该写:
scanf("%f", &scoreEntered);
请注意,编译器可以警告您这种愚蠢的错误,您可以提高警告级别。 使用gcc -Wall -Werror
或clang -Weverything -Werror
来获得最大程度的帮助。
另请注意,您应该测试scanf()
的返回值。如果在单次转换的情况下它没有返回1
则目标变量未被修改,并且有问题的输入将保留在输入流中,从而导致相同的行为无限期重复。 尝试键入A
作为输入并亲自查看(更正丢失的&
后(。
这是一个更正和改进的版本:
#include <stdio.h>
int main(void) {
float grade = 0;
float scoreEntered = 0;
float average = 0;
int numtest = 0;
printf("Press 0 when complete.n");
for (;;) {
printf("nEnter test score: ");
if (scanf("%f", &scoreEntered) != 1 || scoreEntered == 0)
break;
grade += scoreEntered;
numtest++;
average = grade / numtest;
printf("Test: %d Average: %.2fn", numtest, average);
}
return 0;
}