關於sscanf函數的各種詳細用法


看書的時候碰到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:若有大神光臨,渴望求教,感激不盡) 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM