sscanf 從字串讀取格式化資料,原型:
int sscanf(const char *str, const char *format, ...);
回傳成功匹配的項目數。掌握其格式字串技巧,能輕鬆完成複雜字串切割與提取。
%ssscanf("123456", "%s", buf); // buf = "123456"
遇空白字元(空格、換行、Tab)停止。
%4ssscanf("123456", "%4s", buf); // buf = "1234"
%[^a-z] —— 讀到小寫字母停止sscanf("123456abcd", "%[^a-z]", buf); // buf = "123456"
%[1-9a-z]sscanf("123abcDEF", "%[1-9a-z]", buf); // buf = "123abc"
%*[^/]/%[^@]sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
// %*[^/] 忽略 "iios/",%[^@] 讀取 "@" 前內容 → buf = "12DDWDFF"
* 表示「讀取但不儲存」(抑制賦值)。
%*s%ssscanf("hello, world", "%*s%s", buf); // buf = "world"
// 注意:%s 遇空格停,故 "hello," 被 %*s 吃掉,"world" 給 buf
%s%s%s (Tab/空格分隔)sscanf("str1\tstr2\tstr3", "%s%s%s", b1, b2, b3);
// b1="str1", b2="str2", b3="str3"
#include <stdio.h>
#include <string.h>
#define N 512
int main() {
char buf[N], buf2[N], buf3[N];
memset(buf, 0, N); memset(buf2, 0, N); memset(buf3, 0, N);
sscanf("123456", "%s", buf); puts(buf); // 123456
sscanf("123456", "%4s", buf); puts(buf); // 1234
sscanf("123456abcd", "%[^a-z]", buf); puts(buf); // 123456
sscanf("123abcDEF", "%[1-9a-z]", buf); puts(buf); // 123abc
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); puts(buf); // 12DDWDFF
sscanf("hello, world", "%*s%s", buf); puts(buf); // world
sscanf("a\tb\tc", "%s%s%s", buf, buf2, buf3);
printf("%s | %s | %s\n", buf, buf2, buf3); // a | b | c
return 0;
}
%s / %[...] 加寬度,如 %511s,或改用 snprintf 組合。%[^...] 不會自動跳過分隔符,需在格式串顯式寫出(如 /、@)。EOF 或少於預期項目數,表示解析失敗。sscanf 的格式字串支援 %[] 掃描集與 * 抑制賦值,組合起來能處理絕大多數結構化字串解析需求,是 C 語言字串處理的利器。