int sscanf(const char* src, const char* format, ...);
int scanf(const char* format, ...); // 從 stdin 讀取
src:輸入源字串(scanf 為標準輸入)format:格式控制字串,包含轉換規範(%d)、空白字元、非空白字元...:接收結果的指標變數地址EOF(-1)
%[*][width][{h|l|ll|L}]type
*:抑制賦值,跳過匹配項不存入變數(如 %*d)width:最大讀取字元寬度(如 %5s 只讀 5 字元)h/l/ll/L:引數大小修飾(h=short, l=long/double, ll=long long, L=long double)type:轉換類型(d,i,u,o,x,f,e,g,s,c,p,n,[...])%[...]:sscanf 的殺手鐧功能類似正則字元類別,支援範圍、排除、貪婪匹配:
| 格式 | 含義 | 範例輸入 | 結果 |
|---|---|---|---|
%[a-z] | 匹配小寫字母 | "abc123" | "abc" |
%[^ ] | 匹配非空白字元(至空格停止) | "hello world" | "hello" |
%[^/]/%[^@] | 跳過 iios/,取 @ 前內容 | "iios/12DDWDFF@122" | "12DDWDFF" |
%*s%s | 跳過第一個詞,取第二個詞 | "hello, world" | "world" |
char buf[512];
sscanf("123456", "%s", buf); // buf="123456"
sscanf("123456", "%4s", buf); // buf="1234"
sscanf("123456 abcdedf", "%[^ ]", buf); // buf="123456"
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf); // buf="123456abcdedf"
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); // buf="123456abcdedf"
// 取 / 和 @ 之間
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); // buf="12DDWDFF"
// 2006:03:18 - 2006:04:18 (有空格)
char t1[16], t2[16];
sscanf(str, "%s - %s", t1, t2);
// 2006:03:18-2006:04:18 (無空格)
sscanf(str, "%[0-9,:]-%[0-9,:]", t1, t2);
sscanf 立即停止並返回已成功賦值的個數。width 限制最大讀取字元數;掃描集讀取至首個不匹配字元。%n 獲取已讀取字元數
int n;
sscanf("123abc", "%d%n", &val, &n); // val=123, n=3 (指向 'a')
可用於手動解析後續內容或錯誤恢復。
sscanf 是 C 語言字串解析的瑞士軍刀。掌握抑制賦值(*)、掃描集(%[...])、寬度控制 三大核心功能,能以極簡潔代碼處理複雜文本解析任務,避免手寫狀態機解析器的繁瑣與易錯。