分段错误核心已转储...?

lak*_*m99 1 c coredump segmentation-fault

我正在努力实现这一目标:

编写一个接受三个用户输入的程序:作业分数、期中分数和期末考试分数。

这些输入是 float 类型,值应该在 0 到 100 之间。

该程序应以百分比和字母等级的形式计算最终成绩。

• 最终成绩的计算方式为:作业 20%、期中考试 30%、期末考试 50%。字母等级计算为:A(最终成绩 ? 80%)、B(80 > 最终成绩 ? 70%)、C(70 > 最终成绩 ? 60%)、D(60 > 最终成绩 ? 50%)和 F (50 > 最终成绩)。

显示最终成绩和字母成绩。

使用以下代码:

#include <stdio.h>

int checkMark(int);
float getMark();
float computeFinalGrade(float assign, float midterm, float finalExam, float finalGrade);
int computeLetterGrade(float);

int checkMark(int x)
{
    while(x<0 || x>100) //While x is a negative number:
    {
        printf("Invalid entry.Try again:");
        scanf("%d",&x);
    }

    if(x>0 && x<=100)//If x is a positive number:
        x=x;

    return x;
}

float getMark(void)
{
    float mark=0,assignMark=0,midMark=0,examMark=0,finalMark=0;
    char letterGrade;


    printf("Enter assignment grade:");
    scanf("%d",mark);

    checkMark(mark);
    assignMark=mark;

    printf("\nEnter midterm mark:");
    scanf("%f",&mark);

    checkMark(mark);
    midMark=mark;

    printf("\nEnter exam mark:");
    scanf("%f",&mark);

    checkMark(mark);
    examMark=mark;


    finalMark=computeFinalGrade(assignMark,midMark,examMark,finalMark);
    letterGrade=computeLetterGrade(finalMark);

    printf("The final grade for the course is %.1f, and the letter grade is %c.\n",finalMark,letterGrade);

    return 0;
}

float computeFinalGrade(float assign, float midterm, float finalExam, float finalGrade)
{
    assign=(float)0.2*assign;
    midterm=(float)0.3*midterm;
    finalExam=(float)0.4*finalExam;

    finalGrade=(float)assign+midterm+finalExam;
    return finalGrade;
}

int computeLetterGrade(float finalGrade)
{
    int grade;

        if(finalGrade>=80)
            grade=65;

        if(finalGrade<80)
            if(finalGrade>=70)
                grade=66;

        if(finalGrade<70)
            if(finalGrade>=60)
                grade=67;

        if(finalGrade<60)
            if(finalGrade>=50)
                grade=68;

        if(finalGrade<50)
            grade=70;

    return grade;
}

int main()
{
    getMark();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我调试上面的程序并输入一个负数时,它给了我这个:

Enter assignment grade:123
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

我到底做错了什么?

cni*_*tar 5

这是你的问题:

scanf("%d",mark);
Run Code Online (Sandbox Code Playgroud)

您需要传递变量的地址,说明符应该是%f. 尝试:

scanf("%f", &mark);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,有一个关于这个的C FAQ

  • 如果您使用`gcc -Wall -g yourcode.c -o yourprogram` 进行编译,那么编译器就会发现这种情况。但你真的应该学习更多! (2认同)
  • @BasileStarynkevitch 你是如何推断我不知道如何使用 `gdb` 或者我没有在启用警告的情况下编译的? (2认同)