sscanf 是從字串解析格式化資料的強大工具。基本用法(%d, %f, %s)廣為人知,但其掃描集(scanset)功能(%[...])能實現靈活的字串擷取,卻常被忽略。本文系統整理 5 種進階模式。
char str[512] = {0};
sscanf("123456", "%s", str);
printf("str=%s\n", str); // 輸出: 123456
%s 讀取直到空白字元為止。
%Ns
sscanf("123456", "%4s", str);
printf("str=%s\n", str); // 輸出: 1234
最多讀取 4 個字元,自動加上結束符 \0。防止緩衝區溢位的關鍵技巧。
%[^c]
sscanf("123456 abcdedf", "%[^ ]", str);
printf("str=%s\n", str); // 輸出: 123456
^ 表示「非」,[^ ] 意為「非空格字元」。遇到空格停止。
%[set]
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", str);
printf("str=%s\n", str); // 輸出: 123456abcdedf
字元集支援範圍表示法(1-9, a-z, A-Z)。遇到大寫字母 B 停止。
%[^set]
sscanf("123456abcdedfBCDEF", "%[^A-Z]", str);
printf("str=%s\n", str); // 輸出: 123456abcdedf
反向字元集:遇到任一大寫字母停止。
| 語法 | 含義 | 範例 | 匹配字串 | 結果 |
|---|---|---|---|---|
%[abc] | 僅包含 a/b/c | %[abc] | "abacus" | "aba" |
%[a-z] | 小寫字母 | %[a-z] | "hello123" | "hello" |
%[^abc] | 非 a/b/c | %[^aeiou] | "hello" | "h" |
%[^a-z] | 非小寫字母 | %[^0-9] | "abc123" | "abc" |
%[a-zA-Z0-9] | 英數字元 | %[a-zA-Z0-9] | "user_1" | "user" |
%[^\n] | 整行(含空格) | %[^\n] | "hello world" | "hello world" |
char line[256];
sscanf(input, "%255[^\n]", line); // 讀取至換行符或 255 字元
char field[64];
sscanf(csv_line, "%63[^,]", field); // 讀取至逗號
char key[32], value[128];
sscanf(line, "%31[^=]=%127[^\n]", key, value);
sscanf(str, " %[^\n]", line); // 格式字串開頭加空格:跳過任意空白字元
%255s, %63[...])防止溢位%s 不讀取空白:需用 %[^\n] 讀整行] 若在集合中必放第一個(%[]...]),- 放首尾或轉義sscanf 回傳成功賦值的項目數,EOF 為 -1,務必檢查| 場景 | sscanf | regex | 手動解析 |
|---|---|---|---|
| 固定格式、高效能 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐ |
| 複雜模式、巢狀結構 | ⭐ | ⭐⭐⭐ | ⭐⭐ |
| 簡單分隔符分割 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
| 編譯期格式檢查 | ⭐⭐ | ⭐ | ⭐⭐⭐ |
掌握 sscanf 掃描集語法(%[...], %[^...], %Ns),能以極簡潔程式碼處理大量字串解析任務。關鍵在於:指定寬度防溢位、善用反向集合讀取分隔符、檢查回傳值確保解析成功。對於固定格式的高效能解析,sscanf 仍是 C/C++ 開發者工具箱中的利器。