看書的時候碰到sscanf函數,就上網查了很多資料,並加以自己的整理,希望對大家有所幫助。
(因為參考的博客太多太散,就不一一注明,望大神們見諒)
sscanf() :從一個字符串中讀進與指定格式相符的數據.
函數原型:
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
sscanf與scanf類似,都是用於輸入的,只是后者以屏幕(stdin)為輸入源,前者以固定字符串為輸入源。 簡單地說就是輸入的類型不同。
首先要先搞清楚,sscanf函數的返回值:(個人認為不必細究,懂用就好)
成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。返回0表示失敗,否則,表示正確格式化數據的個數
例如:sscanf(str,"%d%d%s", &i,&i2, &s); 如果三個變成都讀入成功會返回3。(同scanf)
如果只讀入了第一個整數到i則會返回1。證明無法從str讀入第二個整數。
sscanf強大的功能體現在對format的支持上。我在這一方面重點整理了一下啊,這里作主要說明:(采用用法+例子幫助大家學習)
一、常見用法。
有點類似於scanf的使用(略有區別),有點賦值的味道。
1. char buf[512] = ;
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
結果為:123456
(注:各種的類型使用相同,都有%d,%s,%f等)
2. 取指定長度的字符串。如在下例中,取最大長度為4字節的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
結果為:1234
二、有關format符號上的特殊用法:
1.%[^a]:表示取到指定字符為止的字符串。
如在下例中,取遇到空格為止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf); printf("%s\n", buf);
輸入的結果為:123456
2.%[a-z] 表示匹配a到z中任意字符。
如在下例中,取僅包含1到9和小寫字母的字符串。 sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf); printf("%s\n", buf); 結果為:123456abcdedf
(結合1.2的使用方法的例子:)
取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。 sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf); printf("%s\n", buf); 結果為:123456abcdedf 取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。 sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); printf("%s\n", buf); 結果為:123456abcdedf
3.%*[]: *亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入. (也就是不把此數據讀入參數中)
結合第一點的用法:
例子:
給定一個字符串iios/12DDWDFF@122,獲取 / 和 @ 之間的字符串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中 sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); printf("%s\n", buf); 結果為:12DDWDFF
外加另一個例子:
給定一個字符串““hello, world”,僅保留world。(注意:“,”之后有一空格) sscanf(“hello, world”, "%*s%s", buf); printf("%s\n", buf); 結果為:world %*s表示第一個匹配到的%s被過濾掉,即hello被過濾了 如果沒有空格則結果為NULL。
4.還有另一些不太常見的用法:
{a|b|c}表示a,b,c中選一 [d],表示可以有d也可以沒有d。 width表示讀取寬度。 {h | l | I64 | L}:參數的size,通常h表示單字節size,I表示2字節 size,L表示4字節size(double例外),l64表示8字節size。 特別的:%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目標參數中寫入值 支持集合操作; %[aB'] 匹配a、B、'中一員
(對於sscanf的用法我就只是淺顯地了解到這里,網上還有很多使用例子,大家可以自己搜下。ps:若有大神光臨,渴望求教,感激不盡)