編寫學生成績管理程式,使用結構體指針操作學生數組。輸入學號、姓名、成績後,查找最高分學生輸出時,成績欄位始終顯示 0.000000。
struct Student {
int number;
char name[20];
double scores;
};
void StuInfo(struct Student *p) {
for (int i = 0; i < 3; i++) {
scanf("%d%s%f", &(p+i)->number, &(p+i)->name, &(p+i)->scores); // 錯誤在這裡
}
}
核心錯誤:scanf 格式字串中對 double 型別使用了 %f 而非 %lf。
%f 對應 float(4 字節)%lf 對應 double(8 字節)&(p+i)->scores 是 8 字節地址,但 scanf 按 4 字節寫入,導致高 4 字節殘留垃圾值,解讀為極小數值(約 0.0)void StuInfo(struct Student *p) {
for (int i = 0; i < 3; i++) {
// %lf 對應 double;name 為數組名即地址,無需 &
scanf("%d %s %lf", &(p+i)->number, (p+i)->name, &(p+i)->scores);
}
}
& 前綴:(p+i)->name 已是 char*,加 & 會變成 char(*)[20],雖然地址相同但類型不匹配,建議移除。scanf 返回值,確保讀取成功。%s 前加空格或使用 fgets + sscanf。| 型別 | scanf 格式 | printf 格式 | 位元組數 |
|---|---|---|---|
| float | %f | %f | 4 |
| double | %lf | %f / %lf | 8 |
| long double | %Lf | %Lf | 16 |
記住:「scanf 讀 double 必用 %lf,printf 印 double 可用 %f」這一口訣,能避開 90% 的此類 Bug。