字串格式:固定欄位以空格分隔,需提取股票代碼、日期、時間、價格等:
str = "600601.SH 20160428 143317 4.45 4.45 4.47 4.33 5500 4.38 20507339 4.9 4.01 0 0 0 4.39 4.38 7200 414246 4.4 4.37 190700 397400 4.41 4.36 247300 303800 4.42 4.35 231700 432500 4.43 4.34 148300 150221";
sscanf 直接按格式字串解析,自動跳過任意長度空白字元(空格、Tab、換行),極適合此類固定欄位記錄。
#include <stdio.h>
int main() {
char *str = "600601.SH 20160428 143317 4.45 4.45 4.47 4.33 5500 4.38 20507339 4.9 4.01 0 0 0 4.39 4.38 7200 414246 4.4 4.37 190700 397400 4.41 4.36 247300 303800 4.42 4.35 231700 432500 4.43 4.34 148300 150221";
char code[20], date[20], time[20];
double open, high, low, close, volume, amount;
// 只示範前 8 欄位,其餘同理
int cnt = sscanf(str, "%19s %19s %19s %lf %lf %lf %lf %lf %lf",
code, date, time, &open, &high, &low, &close, &volume, &amount);
if (cnt == 9) {
printf("代碼: %s\n日期: %s\n時間: %s\n開盤: %.2f\n最高: %.2f\n最低: %.2f\n收盤: %.2f\n成交量: %.0f\n成交額: %.0f\n",
code, date, time, open, high, low, close, volume, amount);
} else {
printf("解析失敗,匹配欄位數: %d\n", cnt);
}
return 0;
}
%19s 限制讀取長度,防止緩衝區溢位(陣列大小 20,留 1 位給 `\0`)。%lf 對應 `double`,`%f` 用於 `float`/`printf`。| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| sscanf | 標準庫、無依賴、格式化強、自動跳空白 | 固定格式、難處理變長欄位 | 固定欄位記錄、日誌解析、配置檔 |
| strtok/strtok_r | 分割靈活、可逐欄位處理 | 破壞原字串、非執行緒安全(strtok)、需手動轉型 | 簡單 CSV、命令列參數分割 |
| 手寫狀態機 | 完全控制、效能極致 | 代碼量大、易出錯 | 超高效能解析器、嵌入式無標準庫 |
| 正則表達式 (PCRE/RE2) | 模式強大、提取命名組 | 依賴第三方庫、編譯/匹配較慢 | 複雜非結構化文本、日誌採集 |