[英]Segmentation fault core dumped…?
我正在努力做到這一點:
編寫一個接受三個用戶輸入的程序:作業標記,期中標記和期末考試標記。
這些輸入的類型為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;
}
當我調試上面的程序並輸入一個負數時,它顯示以下信息:
Enter assignment grade:123
Segmentation fault (core dumped)
我到底在做什么錯?
如果您使用的是Linux,請在此處查看我的答案。 它與valgrind有關,該工具可幫助調試段錯誤,內存泄漏等。
有關代碼的更多說明:
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;
}
應該是:
#define MIN_GRADE 0
#define MAX_GRADE 100
int checkMark(int x)
{
while(x<MIN_GRADE || x>MAX_GRADE)
{
printf("Invalid entry.Try again:");
scanf("%d",&x);
}
return x;
}
注意我:
刪除了無用的評論
刪除魔術數字(0和100)
刪除了一個無用的測試(如果退出while循環,則x在{0,...,100}中
允許x
等於0
刪除了冪等賦值( x=x
沒做任何有用的事情...)
然后:
float getMark(void)
{
float mark=0,assignMark=0,midMark=0,examMark=0,finalMark=0;
char letterGrade;
printf("Enter assignment grade:");
scanf("%d",mark);
^如其他人所述,您應該在此scanf
使用%f
和&mark
。
checkMark(mark);
^在這里,它應該是mark = checkMark(mark);
如果要更新此代碼中的mark
變量。 這是因為mark
的值傳遞給了函數,而不是對變量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);
^在這里傳遞finalMark
作為參數是完全沒有用的。 應該只是finalMark = computeFinalGrade(assignMark, midMark, examMark);
,你不覺得嗎?
letterGrade=computeLetterGrade(finalMark);
printf("The final grade for the course is %.1f, and the letter grade is %c.\n",finalMark,letterGrade);
return 0;
}
如前所述,您無需將一些finalGrade
值傳遞給computeFinalGrade
,您應該可以:
float computeFinalGrade(float assign, float midterm, float finalExam)
{
return 0.2*assign + 0.3*midterm + 0.4*finalExam; // this could even be a macro
}
最后,在computeLetterGrade
,您正在執行大量的冗余測試,並且此變量分配使您的控制流變得混亂,另外,您應該使用char
而不是int
。 嘗試以下方法:
char computeLetterGrade(float finalGrade)
{
if(finalGrade>=80) return 'A';
// Since we did not return, necessarily finalGrade < 80
if(finalGrade>=70) return 'B';
if(finalGrade>=60) return 'C';
if(finalGrade>=50) return 'D';
// All other ifs failed, therefore finalGrade < 50
return 'E';
}
您可能需要修復一些我沒有提到的問題,但至少您應該通過一些更接近目標的工作。
當您的程序嘗試訪問分配給您的程序之外的內存區域時,就會發生分段錯誤。 scanf()
需要該變量的地址。 在代碼中,您將變量的值傳遞給scanf()
而不是cnicutar指出的地址。
scanf("%d",mark);
mark變量未初始化,並且具有一些隨機數據,scanf會在嘗試寫入該地址時將其視為內存位置...由於訪問了受限制的內存,因此發生分段錯誤。 另外,mark是浮點變量,因此應使用%f
說明符。
scanf("%f", &mark);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.