變量各自有名字固然好讀,但面對批量同類數據時,數組用共同名字+下標掩蓋個性,實現「兄弟齊心,其力斷金」。本文通過銀行定長報文解析案例,展示數組如何化解冗長、易錯、難復用的三宗罪。
報文格式(共69字符):
| 域 | 位置 | 長度 | 目標變量 |
|---|---|---|---|
| 賬戶 | 1-19 | 19 | szAccno[20] |
| 姓名 | 20-27 | 8 | szName[9] |
| 交易金額 | 28-39 | 12 | szAmt[13] |
| 交易日期 | 40-47 | 8 | szDate[9] |
| 流水號 | 48-55 | 8 | szLine[9] |
| 狀態 | 56-59 | 4 | szStatus[5] |
| 備註 | 60-69 | 10 | szBz[11] |
strncpy(szAccno, szBuf, 19); szAccno[19]=0;
strncpy(szName, szBuf+19, 8); szName[8]=0;
strncpy(szAmt, szBuf+27, 12); szAmt[12]=0;
// ... 後續全部手工計算起始位置
三宗罪:①代碼冗長;②手工疊加位置極易錯(一錯全錯);③報文格式變更需全量改代碼,復用性極差。
int s = 0;
strncpy(szAccno, szBuf+s, 19); szAccno[19]=0; s += 19;
strncpy(szName, szBuf+s, 8); szName[8]=0; s += 8;
// ...
自動維護起始位置,消除人工計算錯誤,維護時只需改長度常數。
int len[7] = {19,8,12,8,8,4,10};
char varData[7][20];
int s = 0;
for (int i=0; i<7; i++) {
strncpy(varData[i], szBuf+s, len[i]);
varData[i][len[i]] = 0;
s += len[i];
}
關鍵洞見:將離散長度集合為數組,即可用循環統一處理。但目標變量仍分散(szAccno、szName...),無法完全循環化。
char *varP[7] = {szAccno, szName, szAmt, szDate, szLine, szStatus, szBz};
for (int i=0; i<7; i++) {
strncpy(varP[i], szBuf+s, len[i]);
varP[i][len[i]] = 0;
s += len[i];
}
指針數組本質:每個元素是char*,指向目標緩衝區。初始化列表一次性綁定所有目標,循環體完全統一。需求變更(如域順序調整、長度變化、增刪域)只需修改兩個數組初始化列表。
#define LEN 7 使擴展只需改一處下期將挑戰:報文格式大幅變動(域順序重排、長度變化、增刪域),以及要求打印域中文說明。數組能否再次化險為順?