函數原型:
Int sscanf( const char * src, const char * format, ...);
int scanf( const char * format, ...);
這兩個函數很相似,只是第一個函數以src作為輸入,而第二個函數以標准輸入STDIN讀取輸入;
format 是格式控制字符串,它包含控制字符(如:%d,%i,%s等),空白字符(如:空格、制表符\t、回車換行符\n 或其連續組合)以及非空白字符;
...是一組指針變量,是上述函數用來保存結果值的;
返回值為被成功賦值的指針變量的個數,如果該函數發生錯誤,則返回EOF(-1)。
格式控制format:
format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | 空白字符| 非空白符號}
該公式中符號解釋如下:
{a|b|c}:表示a,b,c中選一或幾個;
[d]:表示可以有d也可以沒有d;
* :亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入. (也就是不把此數據讀入參數中) ,用法如:
view plainprint?
const char sourceStr[] = "hello, world";
char buf[10] = ;
sscanf(sourceStr, "%*s%s", buf); //%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
cout << buf<< endl;
結果為:world
width:寬度,一般可以忽略,用法如:
view plainprint?
const char sourceStr[] = "hello, world";
char buf[10] = ;
sscanf(sourceStr, "%5s", buf); //%5s,只取5個字符
cout << buf<< endl;
結果為:hello
{h | l | I64 | L}:參數的size,通常h表示單字節size,I表示2字節 size,L表示4字節size(double例外),l64表示8字節size;
type:即為控制字符如:d, i, f, s, p, 及集合[ ],(注意%號寫在了最前面了,這裡不能再加一個%號了。) 需特別注意和說明的控制符是集合%[ ]:
view plainprint?
%[a-z] 表示匹配a到z中任意字符,貪婪性(盡可能多的匹配)
%[aB'] 匹配a、B、'中一員,貪婪性
%[^a] 匹配非a的任意字符,貪婪性
例如取遇到空格為止字符串:
view plainprint?
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
結果為:123456
再如:
view plainprint?
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
結果為:12DDWDFF
先將 "iios/"過濾掉,再將到字符<a href="mailto:'@'">'@'</a>為止的一串12DDWDFF
空白字符:' ', '\n', '\t' 等;
非空白字符:即一般字符。
格式匹配過程:
該函數從源(src 或STDIN)的前面順序讀取一個或一段字符,並將其與順序取自格式控制字符串中的字符或字符串進行比較匹配:
當遇到一個空白字符時,則不比較而跳過(空格呢?);
當遇到一個非空白字符時,進行比較但不存進指針變量內;
當遇到控制字符時,如果能匹配上,則按照控制字符的意義將從源讀取的字符或字符串存入到下一個指針指向地址處;
不能匹配呢?
特別注意的是:
如果控制字符裡有width,則會將最多這麼多字符串存進下一個指針指向的地址處;
如果是控制符%[],則將源中字符串自當前位置開始到第一個不符合該控制符規定的匹配字符的所有字符存儲到下一個指針指向的地址處。
常見例子:
1. 常見用法。
char buf[512] ;
sscanf("123456 ", "%s", buf);//此處buf是數組名,它的意思是將123456以%s的形式存入buf中!
printf("%s\n", buf);
結果為:123456
2. 取指定長度的字符串。如在下例中,取最大長度為4字節的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
結果為:1234
3. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
結果為:123456
4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
結果為:123456abcdedf
當輸入:
sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%s\n",buf);
結果為:123456
5. 取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
結果為:123456abcdedf
6、給定一個字符串iios/12DDWDFF@122,獲取 / 和 @ 之間的字符串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
結果為:12DDWDFF
7、給定一個字符串"hello, world”,僅保留world。(注意:“,”之後有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
結果為:world
%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
如果沒有空格則結果為NULL。
8.處理2006:03:18 - 2006:04:18(‘-’兩邊有空格)和2006:03:18-2006:04:18(‘-’兩邊無空格):
前者:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
後者:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%[0-9,:]-%[0-9,:]", sztime1, sztime2);
摘自:揚風踏浪 blog