sscanf正則表達式(二)


原文鏈接

表頭文件 #include(stdio.h)<stdio.h>

定義函數 int sscanf (const char *str,const char * format,........);

函數說明 sscanf()會將參數str的字符串根據參數format字符串來轉換並格式化數據。格式轉換形式請參考scanf()。轉換后的結果存於對應的參數內。

返回值 成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。

周星星的代碼:

#include <stdio.h>

int main()
{
      const char* s = "iios/12DDWDFF@122";
      char buf[20];

      sscanf( s, "%*[^/]/%[^@]", buf );
      printf( "%s\n", buf );

      return 0;
}

結果為:12DDWDFF

sscanf與scanf類似,都是用於輸入的,只是后者以屏幕(stdin)為輸入源,前者以固定字符串為輸入源。

函數原型: 

int scanf( const char *format [,argument]... ); 
其中的format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號}, 

注:{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。 



width:寬度,一般可以忽略,用法如: 

const char sourceStr[] = "hello, world"; 

char buf[10] = {0}; 

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 :這就很多了,就是%s,%d之類。 



特別的: 

%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目標參數中寫入值。如: 

const char sourceStr[] = "hello, world"; 

char buf[10] = {0}; 

sscanf(sourceStr, "%*s%s", buf); //%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了 

cout << buf<< endl; 

結果為:world 

支持集合操作: 

%[a-z] 表示匹配a到z中任意字符,貪婪性(盡可能多的匹配) 

%[aB'] 匹配a、B、'中一員,貪婪性 

%[^a] 匹配非a的任意字符,貪婪性 

1. 常見用法。

以下是引用片段:
  charstr[512]={0};
  sscanf("123456","%s",str);
  printf("str=%s
"
,str);

  2. 取指定長度的字符串。如在下例中,取最大長度為4字節的字符串。

以下是引用片段:
  sscanf("123456","%4s",str);
  printf("str=%s
"
,str);

  3. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。

以下是引用片段:
  sscanf("123456abcdedf","%[^]",str);
  printf("str=%s
"
,str);

  4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。

以下是引用片段:
  sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);
  printf("str=%s
"
,str);

  5. 取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。

以下是引用片段:
  sscanf("123456abcdedfBCDEF","%[^A-Z]",str);
  printf("str=%s",str); 

搜集一些特殊用法:

 

%[ ] 的用法:%[ ]表示要讀入一個字符集合, 如果[ 后面第一個字符是”^”,則表示反意思。

                     [ ]內的字符串可以是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個字符


%[^=] 讀取字符串直到碰到’=’號,’^’后面可以帶更多字符,如:

              char s[]="notepad=1.0.0.1001" ;

              char szfilename [32] = "" ;

             int i = sscanf( s, "%[^=]", szfilename ) ;

           // szfilename=notepad 


       如果參數格式是:%[^=:] ,那么也可以從 notepad:1.0.0.1001讀取notepad

參考:


免責聲明!

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



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