C語言中sscanf函式的簡明教程
阿新 • • 發佈:2021-01-23
C語言中sscanf函式的簡明教程
函式定義
int sscanf(const char *str, const char * format, ...);
函式說明
sscanf()
定義於標頭檔案stdio.h
。sscanf()
會將引數str
的字串根據引數format
字串來轉換並格式化資料。格式轉換形式請參考scanf()
。轉換後的結果存於對應的引數內。
返回值
成功則返回引數數目,失敗則返回-1
(也即EOF
)。
引數中format的說明
format中可以包含一個或多個{%[*][width][length]specifier|' '|'\t'|'\n'|所有非%符號}
注:{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。
- width:寬度,忽略則為貪婪模式
- length:對specifier進行修飾,指定儲存型別,可選值有
hh
、h
、l
、ll
、j
、z
、t
、L
- specifier:參考scanf中的specifier
length
和specifier
組合所指定的儲存型別表:
注:黃色行表示實現標準為C99
支援集合操作:
- %[a-z] 表示匹配a到z中任意字元,貪婪性(儘可能多的匹配)
- %[aB’] 匹配a、B、'中一員,貪婪性
- %[^a] 匹配非a的任意字元,貪婪性
- %*[^=] 匹配=之前的字串並跳過
注:集合操作的儲存格式只能為char*或wchar_t*,即不能用%[0-9]接收並存儲為int*
例子
- 貪婪模式(省略
width
)
char result[100];
sscanf("helloworld", "%s", result);
printf("%s", result); // helloworld
- 限定長度
char result[100];
sscanf("helloworld", "%5s", result); // 限定長度為5的字串
printf("%s", result); // hello
- 指定
length
和specifier
long long result;
sscanf("8888888888888", "%lld", &result); // 儲存型別為long long int
printf("%lld", result); // 8888888888888
- 接收但忽略部分字元
char result[100];
sscanf("helloworld", "%*5s %s", result); // %*5s表示接收但忽略5個字元,%s表示接收剩下的字元,format中的空格會被忽略
printf("%s", result); // world
- 集合操作
char result[100];
sscanf("abcdefg8888abc", "%[abc]", result);
// 每個字元只能是a、b、c中的一個,一旦不滿足則接收(忽略後面的所有字元,即使可能會再次滿足條件)
printf("%s", result); // abc
- 指定長度的集合操作
char result[100];
sscanf("ab12cdefg", "%5[a-z0-9]", result); // 接收長度為5並且由a到z、0到9字元組成的字串
printf("%s", result); // ab12c
- 排除部分字元
char result[100];
sscanf("abcdefg", "%[^d-f]", result); // 接收由非d、e、f字元組成的字串
printf("%s", result); // abc
- 同時接收多個變數
char name[100];
int age;
sscanf("name=zhangsan;age=24", "%*[^=] = %[^;] ; age=%d", name, &age); // 分別接收name和age並按指定格式儲存
printf("%s\n", name); // zhangsan
printf("%d\n", age); // 24