sscanf()的一些使用說明

來源:互聯網
上載者:User
這裡有些sscanf()的一些使用說明,都是從論壇,Blog裡整理出來的。供大家使用。
   通過學習和使用個人認為,在字串格式不是很複雜,但是也並不簡單的時候用這個函數比較合適,這個尺度就要靠自己把握了,字串不是很複雜,但自己寫個處理的函數比較麻煩,效率也不高,就用這個函數,如果字串很複雜,那就用Regex吧。
不多說了,看看下面這些介紹和列子吧!名稱: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);
結果為:1234562. 取指定長度的字串。如在下例中,取最大長度為4位元組的字串。
    sscanf("123456 ", "%4s", buf);
    printf("%s\n", buf);
結果為:12343. 取到指定字元為止的字串。如在下例中,取遇到空格為止字串。
    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);
結果為:123456abcdedf6、給定一個字串 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、
 char *s="1try234delete5" 
則:
sscanf(s, "1%[^2]234%[^5]", s1, s2);
scanf的format中出現的非轉換字元(%之前或轉換字元之後的字元),即此例中的1234用來跳過輸入中的相應字元;
‘[]’的含義與Regex中相同,表示匹配其中出現的字元序列;^表示相反。使用[ ]時接收輸入的變數必須是有足夠儲存空間的char、signed char、unsigned char數組。記住[也是轉換字元,所以沒有s了。8、分割以某字元標記的字串。 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);
9、一個提取使用者設定檔中郵件地址的例子
#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或更多字元組成。Null 字元集(%[])是違反規定的,可                     導致不可預知的結果。%[^]也是違反規定的。
          %[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總結:%[]有很大的功能,但是並不是很常用到,主要因為:1、許多系統的 scanf 函數都有漏洞. (典型的就是 TC 在輸入浮點型時有時會出錯). 2、用法複雜, 容易出錯. 3、編譯器作文法分析時會很困難, 從而影響目標代碼的品質和執行效率.個人覺得第3點最致命,越複雜的功能往往執行效率越低下。而一些簡單的字串分析我們可以自已處理。

以前只是簡單是使用sscanf,卻沒發現其還有如此強大的功能
 char str0[100],str1[100],str2[100],str3[100];

 sscanf("abcde abc 123 aaa","%s %s %s %s",str0,str1,str2,str3);
 結果:str0="abcde"   str1="abc"  str2 = "123" str3="aaa"

 sscanf("abcde abc 123 aaa","abc%s %s %*d %s",str0,str1,str3);
 結果:str0="abcde"   str1="abc"  str3="aaa"

 sscanf("abc123 efg456","%4s",str0);
 結果:str0="abc1"   

 sscanf("abc123 efg456a4","%[a-z 1-5]",str0);
 結果:str0="abc123 efg45"   

sscanf("abc123 efg456a4","%[a-z1-5]",str0);
 結果:str0="abc123" 

 sscanf("ABCTabcZ123 efg456","%[A-P]",str0);
 結果:str0="ABC"   

 sscanf("abc 12345","%[^ ]",str0);
 結果:str0="abc"   

 sscanf("abc 12345","%[^4]",str0);
 結果:str0="abc 123"   

 sscanf("fdaBs 52aB1asdf","%[^4-0]",str0);
 結果:str0="fdaBs 5"   

 sscanf("abc 12345","%[^ ]%[^3]",str0,str1);
 結果:str0="abc"    str1="12"

 sscanf("abc301abc2345","%*[^9-0]%s",str0); 
 結果:str0="301abc2345"   
 sscanf("bca@123efg4@5abc","%*[^@]@%[^@]",str0);
 結果:str0="123efg4"   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.