頭文件 #include正則表達式
定義函數 int sscanf (const char *str,const char * format,........);express
函數說明
sscanf()會將參數str的字符串根據參數format字符串來轉換並格式化數據。格式轉換形式請參考scanf()。轉換後的結果存於對應的參數內。小程序
返回值 成功則返回參數數目,失敗則返回-1,錯誤緣由存於errno中。 返回0表示失敗 不然,表示正確格式化數據的個數 例如:sscanf(str,"%d%d%s", &i,&i2, &s); 若是三個變成都讀入成功會返回3。 若是隻讀入了第一個整數到i則會返回1。證實沒法從str讀入第二個整數。 數組
範例 #include
main()
{
int i;
unsigned int j;
char input[ ]=」10 0x1b aaaaaaaa bbbbbbbb」;
char s[5];
sscanf(input,」%d %x %5[a-z] %*s %f」,&i,&j,s,s);
printf(「%d %d %s 」,i,j,s);
}函數
執行 10 27 aaaaaui
sscanf(stringBuf.c_str(), "%20[^#]#%20[^ ]",......)語句中""中的內容含義爲:.net
「%[
]」符號用於聲明字符串,它比「%s」更具體,能夠用於設置讀取的樣式。例如「%[a-z]」只讀取小寫字母,讀到其它字符就結束。注意,方括號中若是有「^」,表明一直讀到某字符爲止。例如:orm
「%[^#]」:讀取字符串,一直到出現「#」號爲止。xml
「%20[^#]」:讀取20個字節的字符串,出現「#」號時結束。內存
因此,「%20[^#]#%20[^ ]」的意義就是,
讀取兩個20字節大小的字符串,第一個字符串能夠用#結束,第二個字符串能夠用回車符結束。
它們的具體闡述,參見MSDN:「scanf Type Field Characters」章節,和「scanf Width
Specification」章節。
*********************************************************************************************************************************************
你們都知道sscanf是一個很好用的函數,利用它能夠從字符串中取出整數、浮點數和字符串等等。它的使用方法簡單,特別對於整數和浮點數來講。但新手可能並不知道處理字符串時的一些高級用法,這裏作個簡要說明吧。
1. 常見用法。
如下是引用片斷:
charstr[512]={0};
sscanf("123456","%s",str);
printf("str=%s
",str);
2. 取指定長度的字符串。如在下例中,取最大長度爲4字節的字符串。
如下是引用片斷:
sscanf("123456","%4s",str);
printf("str=%s
",str);
3. 取到指定字符爲止的字符串。如在下例中,取遇到空格爲止字符串。
如下是引用片斷:
sscanf("123456abcdedf","%[^]",str);
printf("str=%s
",str);
4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
如下是引用片斷:
sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);
printf("str=%s
",str);
5. 取到指定字符集爲止的字符串。如在下例中,取遇到大寫字母爲止的字符串。
如下是引用片斷:
sscanf("123456abcdedfBCDEF","%[^A-Z]",str);
printf("str=%s",str);
*********************************************************************************************************************************************
名稱: sscanf() - 從一個字符串中讀進與指定格式相符的數據.
語法: int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
整數 sscanf( 字符串 str, 字符串 fmt, 混合 var1, 混合 var2 ... );
用法: 以指定的格式 fmt 去解讀字符串 str. fmt 中除了 %d 和 %s 之外, 亦可包含其餘的字符串做爲格式. 每個 %d 或 %s 都對應一個參數, 按順序爲 var1, var2 ... %d 讀入一個整數到參數中, 而 %s 讀入一個字符串. * 亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入. (也就是不把此數據讀入參數中) LPC 的 sscanf() 與 C 的 sscanf() 雖然類似, 但仍有不一樣之處. LPC 的 sscanf() 不須要 (也不可) 提供變量的內存位址給 sscanf(), 只須要給予變量的名字. 另外一個不一樣點是, LPC 的 sscanf() 對於: sscanf( str, "%s %s", str1, str2 ); 的語法, 將會把 str 中的第一個英文單字 (即第一個空白字符之前的內容) 讀入 str1, 後面其他的內容讀入 str2.
sscanf() 會返回符合格式的 %d 和 %s 總數.
之前曾經編寫過這樣的小程序:一個文本文件,每行是一條記錄,每條記錄中包含多個字段,每一個字段之間以某種定界符分開,舉例以下:
Notebook,IBM,ThinkPad X32,6,12000
(各字段以逗號分隔,內容依次是:物品名稱,生產廠家,型號,數量,價格)
若是要對這樣的一行記錄進行處理,提取出各個字段,怎麼作比較好呢?
我之前的作法是在一個循環中用strtok函數每次取一個字段,而後將內容保存到一個字符串數組中。這樣作雖然可行,但我總感受寫出的代碼有些囉嗦。
最近看到一段代碼,用C的標準庫函數sscanf,處理這樣的數據,只需一行就能夠了。我把代碼整理了一下,去掉了無關的部分,核心部分以下:
float price;
int quantity;
char category[21], name[21];
char vendor[21], sku[21];
char buf[201];
fp = fopen(filename, "r");
fgets(buf, 200, fp);
sscanf(buf,
"%20[^#]#%20[^#]#%f#%i#%20[^#]#%20[^/n]",
name, sku, &price, &quantity, category, vendor);
下面簡單作些解說:
%20[^#]# 最多讀入20個字符,直到碰見定界符#,但不包含定界符
%f# 讀入一個浮點數,直到碰見定界符#
%i# 讀入一個整數,直到碰見定界符#
%20[^/n] 最多讀入20個字符,忽略行尾的回車符
是否是很簡潔明瞭呢?
#include <stdio.h>
int main()
{
char log[]="<14>2002-11-11 12:12:12 11.22.33.44 3 3 aaaa aaaaaa";
//char log[]="<1>2002-11-11 12:12:12 11.22.33.44 3 aaaa aaaaaa";
char test[]="<1111> 22";
char log2[200];
char str1[20];
char str2[20];
char str3[20];
char str4[20];
char str5[20];
char str6[20];
char str7[20];
int a1,a2,a3,a4,a5,a6;
sscanf(log,"<%d>%s %s %s %d %d %s",&a1,str2,str3,str4,&a5,&a6,str7);
printf("%d/n",a1);
printf("%s/n",str2);
printf("%s/n",str3);
printf("%s/n",str4);
printf("%d/n",a5);
printf("%d/n",a6);
printf("%s/n",str7);
sscanf(test,"<%d> %d",&a5,&a6);
printf("%d/n",a5);
printf("%d/n",a6);
sscanf(log,"<%[^>]>%[^ ] %[^ ] %[^ ] %[^ ] %[^ ] %[^$]",str1,str2,str3,str4,str5,str6,str7);
printf("%s/n",str1);
printf("%s/n",str2);
printf("%s/n",str3);
printf("%s/n",str4);
printf("%s/n",str5);
printf("%s/n",str6);
printf("%s/n",str7);
return 1;
}
const char *str = "drw-rw-rw- 1 user group 0 Oct 28 2003 -====流行音樂專用FTP=====-";
上面是源串,我要分別獲得drw-rw-rw-,group,-====流行音樂專用FTP=====-字段
注意:由於這幾個字段的值會變化,因此我要用格式化輸入,分別存入下面的a b c中,高手幫忙!
下面這個是我沒成功的嘗試
char a[20];
char b[50];
char c[20];
int ret = sscanf(str, "%[^'' '']* %[''u''] %[^'' '']"
, a, b, c);
masterz(www.fruitfruit.com) 於 2005-8-6 17:43:49
sscanf能夠支持regular expression?或許你要用boost,下面有一個簡單的例子,雖然離你的問題還比較遠
http://www.fruitfruit.com/vc/boost/boost_regex_test.cpp
newbiestar 於 2005-8-6 18:29:18
樓主一個問題好幾個地方問……
int ret = sscanf(str, "%s%*s%*s%s%*s%*s%*s%*s%s", a, b, c);
這樣就能夠了,不要的東西都拋棄掉了
參見這個帖子裏面個人回覆
http://community.csdn.net/Expert/topic/4192/4192979.xml?temp=.2922632
ding8125(丁丁) 於 2005-8-6 19:19:12
能夠經過字符數組輸出一個字符串!~
今天看到一個奇怪的scanf。其實這只是用了正則表達式。
sscanf(user, "%127[^:]:%127[^ ]", user_name, password);
"%127[^:]:%127[^ ]",是正則表達式
用scanf或者printf,能夠在%後面跟%d,%s等東西,也能夠跟一個正則表達式。
這裏,127表示最多能夠接受127個字符,[^:]是正則表達式,表示非":",到":"結束
後面,%127[^ ],一樣,其中[^ ]是正則表達式,表示非" ",到" "結束
因此,若是user是"wpc:123456"的字符串,那麼通過上面的sscanf後,user_name是wpc,而password是123456