今天遇到乙個格式化字串輸入函式如下:
char *pcuserhdr = 「abc[username][inte***ce]」;
sscanf(pcuserhdr, "%*[^[%[^]]][%[^]]",acusername,acinte***ce);
對此學習了下,輸出乙個總結:
1. sscanf函式原型不多做解釋,直接以乙個例子開始;
sscanf(buf, "get /%[^ ]", buf_rev);
基本格式為 %[set],表示將接收乙個由set指定格式的字串,其中set表示可接受的字元集合。
set一般有兩種情況:
一種是"^set"表示非, 即在輸入的字串中將匹配所有不在set中出現的字元,遇到set中的字元時停止匹配。
另一種是"set"表示在輸入的字串中將匹配所有在set中出現的字元,遇到非set中的字元時停止匹配。 如:
scanf("%[^&]",buf); //當輸入的字元中出現"&"時停止匹配,如果輸入hello&world,則buf=hello;
scanf("%[^290#*]",buf); //當輸入aidc#ad時,則buf=aidc,
特殊情況:
(1)如果要匹配"^"時,當然不能直接放在中,所以可以用%[ab^cd]這種方式,
(2)當要匹配右方括號"]"時,應把其放在set中第乙個位置,如"%abc]"表示匹配的字符集為,又如"%[^]abc]"表示匹配所有非"], a, b, c"中的字元,另外,還可以使用"-" 如%[a-z]表示只匹配abcd....yz等小寫的字母; %[0-9]表示只匹配0,1,2...9等數字;
(3) * 表示跳過。
2. 舉例:
例1:#gcc test2.c -o test
#./test
name = aaaa,number = bbbb
#vi test2.c
#include
#include
int main()
;char number[10] = ;
sscanf(str,"%*[^:]:%[^]]][%[^]]",name,number);
printf("name = %s,number = %s\n",name,number);
return 0;
}解釋:
sscanf(str,"%*[^:]:%[^]]][%[^]]",name,number);
1. %*[^:]:%[^]]][%[^]] 可分為3部分理解:①%*[^:] ②:%[^]] ③][%[^]]
1.1 ①%*[^:] 表示:%*跳過,[^:]到**結束,結合起來理解就是跳過直到匹配到第乙個:即結合上面的程式就是跳過了999。
1.2②:%[^]]表示::%從:開始,[^]]到**結束,結合起來理解就是從:開始到直到匹配到]結束,即結合上面的程式就是從:開始到]結束,即值為aaaa。
1.3③][%[^]]表示:][%從][開始,[^]]到**結束,結合起來理解就是從][開始到直到匹配到]結束,即結合上面的程式就是從][到]結束,即值為bbbb。
例 2:
#gcc test2.c -o test
#./test
user = liman,host = host,cmd = 34234,msg = hello
#vi test2.c
#include
#include
int main()
解釋:sscanf(buf, "%*d:%*[^:]:%*[^:]:%[^:]:%[^:]:%d:%s", user, host, &cmd, msg);
1. %*d:%*[^:]:%*[^:]:%[^:]:%[^:]:%d:%s有上面的基礎,這個也拆成7部分理解:
1.1%*d 跳過第乙個整數。 //跳過123
1.2:%*[^:]從:開始跳過直到遇到下乙個:之間的值。 //跳過asdfasd
1.3:%*[^:]從:開始跳過直到遇到下乙個:之間的值。 //跳過2342342
1.4:%[^:]取出從:開始直到下乙個:之間的值。//取出liman
1.5:%[^:]
取出從:開始直到下乙個:之間的值。//取出host
1.6:%d取出從:開始的乙個整數值。//取出34234
1.7:%s取出從:開始的乙個字串的值。//取出hello
那麼再回頭看sscanf(pcuserhdr, "%*[^[%[^]]][%[^]]",acusername,acinte***ce);就不是那麼難了。
可以很快看出跳過從開始到第乙個[之間的值,拿出從[開始到下乙個匹配到]的值,拿出從][開始到匹配到下乙個]的值。
3. 正規表示式基本用法:
1、「.」為萬用字元,表示任何乙個字元,例如:「a.c」可以匹配「anc」、「abc」、「acc」;
2、「」,在內可以指定要求匹配的字元,例如:「a[nbc]c」可以匹配「anc」、「abc」、"acc";但不可以匹配「ancc」,a到z可以寫成[a-z],0到9可以寫成[0-9];
3、數量限定符號,表示匹配次數(或者叫做長度)的符號,包括:
「*」 0次或者多次
「+」 1次或者多次
「?」 0次或者1次
「」 匹配n次,n為整數
「」 匹配從n到m之間的某個數的次數;n和m都是整數;
「」 匹配n到無窮次之間任意次數;
「」 匹配0到m之間任意次數;
數量限定符號放到匹配格式的後面,例如:**號碼:024-84820482,02484820482(假設前面3或者4位,後面7或者8位,並且中間的減號可有可無),都是符合規定的,那麼可以用如下格式來匹配:[0-9] \-? [0-9];注意:「\」為轉義字元,因為「-」在正規表示式用有代表乙個範圍的意義,例如:前面所說的[0-9],所以它需要轉義字元「\」進行轉義才可使用;
4、^為否符號,表示不想匹配的符號,例如:[^z][a-z]+可以匹配所有除"z"開頭的以外的所有字
如果^放到的外邊則表示以開頭的字串;^[az][a-z]+表示a或者z開頭的長度大於等於2的英文本串;
正規表示式用法
正規表示式的概念 什麼是 什麼是正規表示式?是html的乙個變種。一般情況下,論壇不允許你使用 而只能用 替代 是一套由流行的 標籤組成了固定 有統一的格式。使用者只要遵循 規則就可以實現使用者想要的功能。如 想要顯示粗體的how are you 字樣,就應該輸入 how are you而不是輸入h...
正規表示式用法
乙個正規表示式就是由普通字元 例如字元 a 到 z 以及特殊字元 稱為元字元 組成的文字模式。該模式描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 後向引用 或乙個八進位制轉義符。例如,...
正規表示式用法
1 正規表示式 理解 1 就是符合一定規則的字串 2 常見規則 a 字元 x 字元 x。舉例 a 表示字元a 反斜線字元。n 新行 換行 符 u000a r 回車符 u000d b 字元類 abc a b 或 c 簡單類 abc 任何字元,除了 a b 或 c 否定 a za z a到 z 或 a到...