sscanf用法以及Regex的運用

來源:互聯網
上載者:User

表標頭檔 #include(stdio.h)

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

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

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

周星星的代碼:

#include <stdio.h></p><p>int main()<br />{<br /> const char* s = "iios/12DDWDFF@122";<br /> char buf[20];</p><p> sscanf( s, "%*[^/]/%[^@]", buf );<br /> printf( "%s/n", buf );</p><p> return 0;<br />}<br />

結果為: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. 常見用法。</p><p>以下是引用片段:<br />  charstr[512]={0};<br />  sscanf("123456","%s",str);<br />  printf("str=%s",str);</p><p>  2. 取指定長度的字串。如在下例中,取最大長度為4位元組的字串。</p><p>以下是引用片段:<br />  sscanf("123456","%4s",str);<br />  printf("str=%s",str);</p><p>  3. 取到指定字元為止的字串。如在下例中,取遇到空格為止字串。</p><p>以下是引用片段:<br />  sscanf("123456abcdedf","%[^]",str);<br />  printf("str=%s",str);</p><p>  4. 取僅包含指定字元集的字串。如在下例中,取僅包含1到9和小寫字母的字串。</p><p>以下是引用片段:<br />  sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);<br />  printf("str=%s",str);</p><p>  5. 取到指定字元集為止的字串。如在下例中,取遇到大寫字母為止的字串。</p><p>以下是引用片段:<br />  sscanf("123456abcdedfBCDEF","%[^A-Z]",str);<br />  printf("str=%s",str); </p><p> 
 

搜集一些特殊用法:

 

%[ ] 的用法:%[ ]表示要讀入一個字元集合, 如果[ 後面第一個字元是”^”,則表示反意思。</p><p> [ ]內的字串可以是1或更多字元組成。Null 字元集(%[])是違反規定的,可</p><p> 導致不可預知的結果。%[^]也是違反規定的。</p><p>%[a-z] 讀取在 a-z 之間的字串,如果不在此之前則停止,如</p><p> char s[]="hello, my friend” ; // 注意: ,逗號在不 a-z之間</p><p> sscanf( s, “%[a-z]”, string ) ; // string=hello</p><p>%[^a-z] 讀取不在 a-z 之間的字串,如果碰到a-z之間的字元則停止,如</p><p> char s[]="HELLOkitty” ; // 注意: ,逗號在不 a-z之間</p><p> sscanf( s, “%[^a-z]”, string ) ; // string=HELLO</p><p>%*[^=] 前面帶 * 號表示不儲存變數。跳過合格字串。</p><p> char s[]="notepad=1.0.0.1001" ;</p><p> char szfilename [32] = "" ;</p><p> int i = sscanf( s, "%*[^=]", szfilename ) ; </p><p>// szfilename=NULL,因為沒儲存</p><p>int i = sscanf( s, "%*[^=]=%s", szfilename ) ; </p><p>// szfilename=1.0.0.1001</p><p>%40c 讀取40個字元</p><p>%[^=] 讀取字串直到碰到’=’號,’^’後面可以帶更多字元,如:</p><p> char s[]="notepad=1.0.0.1001" ;</p><p> char szfilename [32] = "" ;</p><p> int i = sscanf( s, "%[^=]", szfilename ) ; </p><p> // szfilename=notepad </p><p> 如果參數格式是:%[^=:] ,那麼也可以從 notepad:1.0.0.1001讀取notepad</p><p>  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.