sscanf正規表示式

2021-05-28 17:24:13 字數 3435 閱讀 3001

c語言 -sscanf正規表示式

2011-01-07 00:18

表頭檔案 #include(stdio.h)

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

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

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

周星星的**:

#include

int main(

)結果為:12ddwdff

sscanf與scanf類似,都是用於輸入的,只是後者以螢幕(

stdin

)為輸入源,前者以固定字串為輸入源。

函式原型: 

int scanf( const char *format [,argument]... ); 

其中的format可以是乙個或多個 ]type | ' ' | '\t' | '\n' | 非%符號}, 

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

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

const char sourcestr = "hello, world"; 

char buf[10] = ; 

sscanf(sourcestr, "%5s", buf); //%5s,只取5個字元 

cout << buf<< endl; 

結果為:hello 

:引數的size,通常h表示單位元組size,i表示2位元組 size,l表示4位元組size(double例外),l64表示8位元組size。 

type :這就很多了,就是%s,%d之類。 

特別的: 

%*[width] type 表示滿足該條件的被過濾掉,不會向目標引數中寫入值。如: 

const char sourcestr = "hello, world"; 

char buf[10] = ; 

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

cout << buf<< endl; 

結果為:world 

支援集合操作: 

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

%[ab'] 匹配a、b、'中一員,貪婪性 

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

1. 常見用法。

以下是引用片段:

charstr[512]=;

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

sscanf與正規表示式

from 今天翻google reader的時候看到這樣一篇文章,介紹的是sscanf的高階用法。直到今天我才知道sscanf是可以直接用正規表示式的,慚愧。在msdn中sscanf的宣告如下 int sscanf const char buffer const char format argume...

sscanf正規表示式 二

表頭檔案 include stdio.h 定義函式 int sscanf const char str,const char format,函式說明 sscanf 會將引數str的字串根據引數format字串來轉換並格式化資料。格式轉換形式請參考scanf 轉換後的結果存於對應的引數內。返回值 成功...

sscanf函式和正規表示式

此文所有的實驗都是基於下面的程式 char str 10 for int i 0 i 10 i str i 執行完後str的值為 str 我們把str的每個字元都初始化為驚嘆號,當str的值發生變化時,使用printf列印str的值,對比先前的驚嘆號,這樣就可以方便的觀察str發生了怎樣的變化。下面...