首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

別告訴我你懂數組(一):從銀行報文解析看數組化繁為簡的威力

     編輯:關於C語言

引言:數組是「團結就是力量」的編程體現

變量各自有名字固然好讀,但面對批量同類數據時,數組用共同名字+下標掩蓋個性,實現「兄弟齊心,其力斷金」。本文通過銀行定長報文解析案例,展示數組如何化解冗長、易錯、難復用的三宗罪。

案例背景:定長報文拆分

報文格式(共69字符):

域位置長度目標變量
賬戶1-1919szAccno[20]
姓名20-278szName[9]
交易金額28-3912szAmt[13]
交易日期40-478szDate[9]
流水號48-558szLine[9]
狀態56-594szStatus[5]
備註60-6910szBz[11]

版本一:硬編碼地址計算(三宗罪版)


strncpy(szAccno, szBuf, 19); szAccno[19]=0;
strncpy(szName, szBuf+19, 8); szName[8]=0;
strncpy(szAmt, szBuf+27, 12); szAmt[12]=0;
// ... 後續全部手工計算起始位置

三宗罪:①代碼冗長;②手工疊加位置極易錯(一錯全錯);③報文格式變更需全量改代碼,復用性極差。

版本二:引入位置累加器s(消除手工計算)


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*,指向目標緩衝區。初始化列表一次性綁定所有目標,循環體完全統一。需求變更(如域順序調整、長度變化、增刪域)只需修改兩個數組初始化列表。

核心啟示

  1. 數組聚合離散數據:長度、目標地址、域說明等均可入數組
  2. 循環消除重複邏輯:相同操作模式+數組下標 = 極簡代碼
  3. 宏常量參數化:#define LEN 7 使擴展只需改一處
  4. 需求可引導:存儲結構屬實現細節,引導客戶接受數組存儲而非分散變量

思考題預告

下期將挑戰:報文格式大幅變動(域順序重排、長度變化、增刪域),以及要求打印域中文說明。數組能否再次化險為順?

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved