一、描述
sscanf通常被用來解析并轉換字元串,其格式定義靈活多變,可以實作很強大的字元串解析功能。
sscanf的原型
#include <stdio.h>
int sscanf(const char *str, const char *format, ...);
str:待解析的字元串;
format:字元串格式描述;
其後是一序列數目不定的指針參數,存儲解析後的資料.
二、示例用法
1. sscanf的基本用法
整形數轉換
int year, month, day;
int converted = sscanf("20191103", "%04d%02d%02d", &year, &month, &day);
printf("converted=%d, year=%d, month=%d, day=%d/n", converted, year, month, day);
輸出結果:
converted=3, year=2019, month=11, day=03
"%04d%02d%02d"是用來解析字元串的格式,%表示格式轉換的開始,d表示轉換為一個整數,04作為d的修飾,表示這是一個長度為4位的整數,不足4位時以0補齊。
例子傳回結果等于3,表示有3個資料成功轉換,轉換成功數目同時取決于被解析的字元串以及其轉換格式,如果我們把例子中的格式改為"%04d%02d",那麼sscanf将隻傳回2,day的數值不會被sscanf更改。
浮點數轉換
double longitude, latitude;
int converted = sscanf("113.123456789 31.123456789", "%lf %lf", &longitude, &latitude);
printf("converted=%d, longitude=%.9lf, latitude=%lf/n", converted, longitude, latitude);
輸出結果:
converted=2, longitude=113.123456789, latitude=31.123457
sscanf的格式字元串中,f表示這是一個浮點數,其修飾詞l表示這是一個double的浮點數。
2. sscanf的進階用法
數字+字元串
char str[32] = "";
sscanf("123456abcdedf", "%31[0-9]", str);
printf("str=%s/n", str);
輸出結果:
str=123456
上面的格式中,[0-9]表示這是一個僅包含0-9這幾個字元的字元串,前面使用數字31修飾詞表示這個字元串緩沖區的最大長度(這也是sscanf最為人诟病的地方,很容易出現緩沖區溢出錯誤,實際上sscanf是可以避免出現緩沖區溢出的,隻要在書寫任何字元串解析的格式時,注意加上其緩沖區尺寸的限制)。
char str[32] = "";
sscanf("123456abcdedf", "%31[0-9a-z]", str);
printf("str=%s/n", str);
輸出結果:
str=123456abcdedf
在格式[]中增加了a-z的描述。
使用^示例:
char str[32] = "";
sscanf("123456abcdedf", "%31[^a-z]", str);
printf("str=%s/n", str);
輸出結果:
str=123456
在[]中增加表示相反的意思,上面的[a-z]表示一個不包含任何a-z之間的字元串。
使用*的例子:
char str[32] = "";
int ret = sscanf("123456abcdedf", "%*[0-9]%31[a-z]", str);
printf("ret=%d, str=%s/n",ret, str);
輸出結果:
ret=1, str=abcdedf
加上*修飾表示一個被忽略的資料,同時也不需要為它準備空間存放解析結果。如上面的例子中,我們就隻使用了str一個參數存放%31[a-z]的解析結果,而sscanf也隻傳回1,表示隻解析了一個資料。
掌握了[], ^, *如何使用後,我們會發現sscanf原來是一個如此強大的工具,很多我們原先認為必須使用正規表達式的地方,很可能使用sscanf就可以實作。