上期通過 char *varP[LEN] = {szAccno, szName, ...} 將離散目標緩衝區聚合,配合長度數組 len[] 與位置累加器 s,實現報文解析邏輯的單循環、零重複、參數化維護。
新格式:域順序重排、長度變化、增刪域
| 新順序 | 域 | 長度 | 目標變量 |
|---|---|---|---|
| 1 | 交易日期 | 8 | szDate[9] |
| 2 | 流水號 | 12 | szLine[13] |
| 3 | 賬戶 | 19 | szAccno[20] |
| 4 | 姓名 | 8 | szName[9] |
| 5 | 交易金額 | 16 | szAmt[17] |
| 6 | 傳票號(新增) | 8 | szBill[9] |
| 7 | 狀態 | 4 | szStatus[5] |
應對:只需調整兩個數組初始化列表順序與數值,循環體零修改:
int len[7] = {8, 12, 19, 8, 16, 8, 4};
char *varP[7] = {szDate, szLine, szAccno, szName, szAmt, szBill, szStatus};
// 循環體完全不變
對比硬編碼版需逐行改地址計算、增刪代碼行,優劣立判。
需求:輸出 第1號域,賬號,9559901010008888888】
方案:再增一個說明數組:
char *desc[7] = {"賬號", "戶名", "金額", "日期", "流水", "狀態", "備註"};
// 打印循環
for (int i=0; i
說明文字與業務邏輯解耦,多語言擴展只需替換 desc 數組(或載入資源文件)。
| 維度 | 傳統硬編碼 | 數組驅動 |
|---|---|---|
| 邏輯表達 | 分散在N行重複代碼中 | 集中在單一循環體 |
| 參數管理 | 散落在字面常數中 | 集中在數組初始化列表 |
| 變更響應 | 全量掃描修改,高風險 | 定點修改數組,零邏輯變更 |
| 擴展性 | 差(加域需加代碼行) | 強(加數組元素即可) |
| 可讀性 | 低(被重複細節淹沒) | 高(結構與數據分離) |
#define DEF_FIELD(name, buf, length, desc) \
{ .target=buf, .len=length, .desc=desc }
struct FieldDef {
char *target;
int len;
const char *desc;
} fields[] = {
DEF_FIELD(szAccno, 19, "賬號"),
DEF_FIELD(szName, 8, "戶名"),
// ...
};
結構體數組進一步將「目標、長度、說明」三元組聚合,單一數據源消除多數組索引對齊風險。
數組不只是存儲容器,更是將變化點參數化、將不變點循環化的架構工具。掌握「指針數組統一目標、多屬性並行數組/結構體數組聚合元數據、宏/結構體封裝定義」三重技法,讓代碼在需求風浪中「任憑風浪起,穩坐釣魚台」。
本系列將以案例驅動講透數組精髓,擬定書名備選:
歡迎讀者投票或提出更佳建議!