sscanf()

名稱:sscanf() - 從一個字符串中讀進與指定格式相符的數據. 
函數原型: 
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); 
int scanf( const char *format [,argument]... );
說明: 
sscanf與scanf相似,都是用於輸入的,只是後者以屏幕(stdin)爲輸入源,前者以固定字符串爲輸入源。 
其中的format能夠是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號}
支持集合操做: 
     %[a-z] 表示匹配a到z中任意字符,貪婪性(儘量多的匹配) 
     %[aB'] 匹配a、B、'中一員,貪婪性 
     %[^a] 匹配非a的任意字符,貪婪性
例子: 
1. 常見用法。 
    char buf[512] = {0}; 
    sscanf("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 

5. 取到指定字符集爲止的字符串。如在下例中,取遇到大寫字母爲止的字符串。 
    sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); 
    printf("%s\n", buf); 
結果爲:123456abcdedf
六、給定一個字符串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。 
八、 
char *s="1try234delete5" 
則: 
sscanf(s, "1%[^2]234%[^5]", s1, s2); 
scanf的format中出現的非轉換字符(%以前或轉換字符以後的字符),即此例中的1234用來跳過輸入中的相應字符; 
‘[]’的含義與正則表達式中相同,表示匹配其中出現的字符序列;^表示相反。使用[ ]時接收輸入的變量必須是有足夠存儲空間的char、signed char、unsigned char數組。記住[也是轉換字符,因此沒有s了。
八、分割以某字符標記的字符串。
char test[]="222,333,444,,,555,666"; 
char s1[4],s2[4],s3[4],s4[4],s5[4],s6[4],s7[4]; 
sscanf(test,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",s1,s2,s3,s4,s5,s6,s7); 
printf("sssa1=%s",s1); 
printf("sssa2=%s",s2); 
printf("sssa3=%s",s3); 
printf("sssa4=%s",s4); 
printf("sssa5=%s",s5); 
printf("sssa6=%s",s6); 
printf("sssa7=%s",s7); 
九、一個提取用戶我的資料中郵件地址的例子 
#include<cstdlib> 
#include<cstdio> 
using namespace std; 
int main() 

    char a[20]={0}; 
    char b[20]={0}; 
    //假設email地址信息以';'結束 
    sscanf("email:jimmywhr@gmail.com;","%*[^:]:%[^;]",a); 
    //假設email地址信息沒有特定的結束標誌 
    sscanf("email:jimmywhr@gmail.com","%*[^:]:%s",b); 
    printf("%s\n",a); 
    printf("%s\n",b); 
    system("pause"); 
    return 0; 

關鍵是"%*[^:]:%[^;]"和"%*[^:]:%s"這兩個參數的問題 
%*[^:]    表示知足"[]"裏的條件將被過濾掉,不會向目標參數中寫入值。這裏的意思是在 
            第一個':'以前的字符會在寫入時過濾掉,'^'是表示否認的意思,整個參數翻譯 
            成白話就是:將在遇到第一個':'以前的(不爲':'的)字符所有過濾掉。 
:         天然就是跳過':'的意思。 
%[^;]     拷貝字符直到遇到';'。
一下摘自:http://blog.csdn.net/lbird/archive/2007/08/03/1724429.aspx 
%[ ] 的用法:%[ ]表示要讀入一個字符集合, 若是[ 後面第一個字符是」^」,則表示反意思。
                     [ ]內的字符串能夠是1或更多字符組成。空字符集(%[])是違反規定的,可
                     致使不可預知的結果。%[^]也是違反規定的。 
         
%[a-z] 讀取在 a-z 之間的字符串,若是不在此以前則中止,如
              char s[]="hello, my friend」 ;         // 注意: ,逗號在不 a-z之間
              sscanf( s, 「%[a-z]」, string ) ; // string=hello

%[^a-z] 讀取不在 a-z 之間的字符串,若是碰到a-z之間的字符則中止,如
              char s[]="HELLOkitty」 ;         // 注意: ,逗號在不 a-z之間
              sscanf( s, 「%[^a-z]」, string ) ; // string=HELLO

%*[^=]    前面帶 * 號表示不保存變量。跳過符合條件的字符串。
              char s[]="notepad=1.0.0.1001" ;
       char szfilename [32] = "" ;
       int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL,由於沒保存
int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001
%40c      讀取40個字符
       The run-time
library does not automatically append a null terminator
to the string, nor does reading 40 characters
automatically terminate the scanf() function. Because the
library uses buffered input, you must press the ENTER key
to terminate the string scan. If you press the ENTER before
the scanf() reads 40 characters, it is displayed normally,
and the library continues to prompt for additional input
until it reads 40 characters

%[^=]     讀取字符串直到碰到’=’號,’^’後面能夠帶更多字符,如:
              char s[]="notepad=1.0.0.1001" ;
       char szfilename [32] = "" ;
       int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad     
       若是參數格式是:%[^=:] ,那麼也能夠從 notepad:1.0.0.1001讀取notepad
             
使用例子:
char s[]="notepad=1.0.0.1001" ;
char szname [32] = "" ;
char szver [32] = 「」 ;
sscanf( s, "%[^=]=%s", szname , szver ) ; // szname=notepad, szver=1.0.0.1001
總結:%[]有很大的功能,可是並非很經常使用到,主要由於:
一、許多系統的 scanf 函數都有漏洞. (典型的就是 TC 在輸入浮點型時有時會出錯).
二、用法複雜, 容易出錯.
三、編譯器做語法分析時會很困難, 從而影響目標代碼的質量和執行效率.
相關文章
相關標籤/搜索