錯誤代碼
scanf("%d,%d=,%f", &d, &p, &r); // 格式字串包含多餘字元 ",="
問題分析
scanf 依格式字串 **逐字元匹配** 輸入流。
格式 "%d,%d=,%f" 要求輸入為:數字,數字=,浮點數 (如 10,20=,3.14)。
- 若實際輸入
10 20 0.05 (空格分隔),scanf 讀第一個 %d 成功 (d=10),遇逗號 ',' 匹配失敗 → **停止掃描**,p、r **未被賦值** (保留棧上垃圾值)。
- 後續運算
p - d*r 為負 → log10(負數) 產生 NaN → 列印 -1.#IND00 (VC++ NaN 表示)。
修正方法
// 方案一:格式字串僅含格式佔位符,以空白分隔
scanf("%d %d %f", &d, &p, &r);
// 方案二:若輸入確實含逗號,精確匹配
scanf("%d,%d,%f", &d, &p, &r); // 輸入: 10,20,0.05
防禦性程式設計
if (scanf("%d %d %f", &d, &p, &r) != 3) {
fprintf(stderr, "輸入格式錯誤\n");
return 1;
}
if (p - d * r <= 0) {
fprintf(stderr, "參數不滿足 p > d*r,對數無意義\n");
return 1;
}