問題代碼
double taxsalary;
scanf("%ld", &taxsalary); // 錯誤:%ld 對應 long int
printf("taxpay:%ld\n", taxpay); // 同樣錯誤
錯誤原因
%ld 期望 long int *,實際傳入 double *(8 字節)。
- 棧上讀取 4 字節(long)卻寫入 8 字節(double),導致棧損壞、數值解讀錯誤,輸出亂碼/巨大負數。
正確格式字符
| 類型 | scanf | printf |
| float | %f | %f |
| double | %lf | %f / %lf (C99 允許 printf 用 %lf) |
| long double | %Lf | %Lf |
| long int | %ld | %ld |
修正代碼
double taxsalary, taxpay;
scanf("%lf", &taxsalary); // 讀取 double
printf("taxpay: %.2f\n", taxpay); // 輸出 double,保留兩位小數
避坑指南
- 開啟編譯器警告:
-Wall -Wextra -Wformat (GCC/Clang),/W4 (MSVC) 會提示格式不匹配。
- 使用
static analysis 工具(Cppcheck、Clang Static Analyzer)。
- 習慣對照
man 3 scanf / man 3 printf 查閱。
- 上一篇文章: jQuery EasyUI jqGrid 客戶端數據綁定:data vs url 參數衝突
- 下一篇文章: Crystal Reports for VS 版本不匹配與運行時版本升級問題
Copyright ©
程式碼之家 All Rights Reserved