#include <stdio.h>
void convert(char *a, int n) {
int i;
if ((i = n / 10) != 0) convert(【1】, i);
*a = 【2】;
}
void main() {
char a[10], *p = a;
int i, n = 1234578;
for (i = 0; i <= 8; i++) a[i] = ' ';
a[9] = 0;
printf("bf %s\n", a);
convert(p, n);
printf("ok %s\n", a);
}
n 的各位數字**逆序**存入 a 指向的字符數組。例:1234578 → "8754321"。i = n/10 為去掉最後一位後的數 (如 123457)。i != 0,先遞歸處理高位部分,**遞歸調用需指向數組下一位置**,否則會覆蓋。n%10 轉為字符存入 *a。| 空號 | 填入表達式 | 解析 |
|---|---|---|
| 【1】 | a + 1 | 遞歸處理高位時,目標地址後移一位,騰出當前位置給最低位 |
| 【2】 | (n % 10) + '0' | 取最低位數值 (0-9),加字符 '0' (ASCII 48) 轉為對應字符 '0'-'9' |
convert(a, 123)
i = 12 != 0 → convert(a+1, 12)
i = 1 != 0 → convert(a+2, 1)
i = 0 → 不遞歸
* (a+2) = (1%10)+'0' = '1' // a[2]='1'
* (a+1) = (12%10)+'0' = '2' // a[1]='2'
* a = (123%10)+'0' = '3' // a[0]='3'
結果: a = "321" (逆序) ✓
for (i = 0; i <= 8; i++) a[i] = ' '; // 填充空格,便於觀察未寫入位置
a[9] = 0; // 字符串結束符,防止 printf 越界讀取
printf("bf %s\n", a); // 輸出初始狀態 (全空格)
convert(p, n); // p 指向 a[0]
printf("ok %s\n", a); // 輸出逆序字符串
bf
ok 8754321
a+1 實現「從左到右」填充,配合遞歸「先處理高位、再填低位」天然形成逆序。'0' 作為基準,(digit)+'0' 是 C 語言標準慣用語,無需查表。a[9]=0 保證輸出安全,遞歸不寫入結束符由調用者負責。本題考察遞歸分治、指針算術、字符編碼轉換三大核心技能。填空 a+1 和 (n%10)+'0' 精準對應「遞歸深度對應數組索引遞進」與「數值轉字符」兩大關鍵邏輯,構成極其精簡的整數逆序字符串生成算法。