程式碼意圖用遞迴計算總和,但無論輸入什麼,輸出固定數值。經排查,非遞迴邏輯錯誤,而是 scanf 格式字串包含中文字符導致輸入匹配失敗,變數未被賦值,殘留棧上隨機值參與運算。
int n;
scanf("請輸入一個數字:%d", &n); // 格式字串含中文
printf("總和 = %d", sum(n));
scanf 按格式字串逐字符匹配輸入流。10\n,格式字串期望 請輸入一個數字: 開頭 → 匹配失敗,scanf 立即返回,n 未修改。n 為未初始化區域變數 → 不定值 → 運算結果不可預期。printf("請輸入一個數字:"); // 提示訊息單獨印
scanf("%d", &n); // 格式字串只含格式指示符
原程式碼 sum(n) 內部未呼叫自己,只是普通函式。**遞迴定義:函式直接/間接呼叫自身**,如:
int sum(int n) {
if (n <= 1) return n;
return n + sum(n - 1); // 真正的遞迴
}
| 錯誤 | 正確 | 說明 |
|---|---|---|
scanf("數字:%d", &n); | printf("數字:"); scanf("%d", &n); | 提示與讀取分離 |
scanf("%d%d", &a, &b); | scanf("%d %d", &a, &b); | 空白分隔更穩健 |
| 忽略返回值 | if (scanf("%d", &n) != 1) { /* 錯誤處理 */ } | 檢查匹配成功數量 |
| 緩衝區殘留換行符 | scanf(" %c", &ch); (前置空白) | 跳過空白字符 |
scanf 格式字串只能包含格式指示符(%d、%f、%c...)與空白字符,任何可見字符(含中文、標點)都會要求輸入流完全匹配,導致讀取失敗。養成「提示用 printf、讀取用純格式 scanf」的習慣,並永遠檢查返回值。