当我尝试运行此代码时,为什么Code :: Blocks会一直崩溃?

时间:2017-07-07 02:48:02

标签: c

当我在这个简单的代码中输入第一个分数时,

Code :: Blocks不断崩溃。这是我理解的完美类型代码,现在我很困惑。

#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. \n\n");
    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;
}

3 个答案:

答案 0 :(得分:3)

scanf("%f", scoreEntered);

应该是

scanf("%f", &scoreEntered);

scanf期望变量的地址,当你传递变量而不是变量的地址时,它最终会访问导致段错误的无效内存

答案 1 :(得分:2)

您的错误在第16行

应该是

scanf("%f", &scoreEntered);

<强>原因

“&安培;”用于获取变量的地址,“scanf()”需要变量的地址来存储数据

答案 2 :(得分:1)

问题是您传递scanf()的值scoreEntered而不是其地址。你应该写:

    scanf("%f", &scoreEntered);

请注意,编译器可以警告您这种愚蠢的错误,它会提高警告级别。使用gcc -Wall -Werrorclang -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: %.2f\n", numtest, average);
    }

    return 0;
}