sscanf的高階用法

2021-06-20 05:23:34 字數 3252 閱讀 8494

sscanf的高階用法

printf或者sprintf一定是任何乙個c程式設計師最常見到的函式,與sprintf的作用相反,sscanf通常被用來解析並轉換字串,其格式定義靈活多變,可以實現很強大的字串解析功能。

sscanf的原型很簡單,定義如下:

#include

int sscanf(const char *str, const char *format, ...);

str:待解析的字串

format:字串格式描述,其後是一串行數目不定的指標引數,儲存解析後的資料

下面是乙個簡單的例子:

int year, month, day;

int converted = sscanf("20080808", "%04d%02d%02d", &year, &month, &day);

printf("converted=%d, year=%d, month=%d, day=%d/n", converted, year, month, day);

輸出結果:

converted=3, year=2008, month=8, day=8

"%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的浮點數。

上面是兩個關於sscanf基本的例子,下面我們來演示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就可以實現。

轉換型別:

%d:整數,需要乙個型別為int*的的引數存放轉換結果

%i:整數,如果字串以0x或者0x開頭,則按16進製制進行轉換,如果以0開頭,則按8進製進行轉換,否則按10進製轉換,需要乙個型別為int*的的引數存放轉換結果

%o:無符號的8進製數,需要乙個型別為unsigned int*的引數存放轉換結果

%u:無符號的整數,需要乙個型別為unsigned int*的引數存放轉換結果

%x:無符號的16進製制數,需要乙個型別為unsigned int*的引數存放轉換結果

%x:等同於%x

%f:浮點數,需要乙個型別為float*的引數存放轉換結果

%c:單個字元,需要乙個型別為char*的引數存放轉換結果

%s:以空格或者換行符結尾的字串,需要乙個型別為char*的引數存放轉換結果

%:僅包含在中的字元的字串,如[0-9]表示乙個全部是數字的字串,[a-z]表示乙個全部為小寫字母的字串,需要乙個型別為char*的引數存放轉換結果

%[^]:與上面相反,[^之後,]之前的所有字元都作為字串結束標誌,如[^0-9]表示乙個不包含任何0-9的字串,需要乙個型別為char*的引數存放轉換結果

轉換型別修飾符:

*:忽略標誌,如%*d表示忽略乙個整數,%*s表示忽略乙個字串

h:short修飾符,如%hd表示這是乙個short int的整數

l:long修飾符,如%ld表示這是乙個long int的整數, %lf表示這是乙個double的浮點數(%f表示乙個float的浮點數)

l:  long long修飾符,如%ld表示這是乙個64位位元組的整數, %lf表示這是乙個long double的浮點數

i64:  __int64修飾符,如%i64d表示這是乙個64位位元組的整數

sscanf的高階用法

sscanf的高階用法 總結 2012 04 25 18 50 25 分類 c c sscanf recvbuf,s buf rev sscanf buf,get buf rev 這個是在乙個webserver.c裡面的例子,通過sscanf 語句可以找到和它前面相匹配的語句然後列印出後面需要的東西...

sscanf的高階用法

c c sscanf recvbuf,s buf rev sscanf buf,get buf rev example 1 scanf buf 當輸入的字元中出現 時停止匹配,如果輸入hello world,則buf hello 片 2 scanf 290 buf 當輸入aidc ad時,則buf ...

sscanf高階用法總結

大家都知道sscanf是乙個很好用的函式,利用它可以從字串中取出整數 浮點數和字串等等。它的使用方法簡單,特別對於整數和浮點數來說。但新手可能並不知道處理字串時的一些高階用法,這裡做個簡要說明吧。1.常見用法。char str 512 sscanf 123456 s str printf str s...