sscanf,scanf,fscanf與正規表示式

2021-05-21 18:53:55 字數 3429 閱讀 5691

表頭檔案 #include(stdio.h )

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

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

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

#

include

< stdio. h>

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

正規表示式與正則語言

正規表示式和正則語言是一致的。但能不能用正規表示式識別,是需要分析的。比如0與1一樣多的01串,是否可以識別?根據幫浦引理是不可以的,所以如果想通過正規表示式來處理,那將是歧途。01與10一樣多的,是可以識別的。因為通過分析後,可以知道01與10無論如何他們的個數不會差別超過1.所以可以據此構造有限...

正則集與正規表示式辨析

歸納 定義正規表示式的運算和正則集的運算的對映關係 a b cup ab 的元素和的元素分別連線 現在有正規表示式w1,w2,根據基礎,分別有map w1 集合t1,map w2 集合t2。對w1和w2進行有限次運算,即operation w1,w2 根據歸納,有map operation oper...

正規表示式與python

在python中有乙個非常重要也非常好用的模組re,在import re後,就能夠在python中使用正規表示式,源於此次專案要用正規表示式對html 提取一定的字元,所以在這也就用些小例子來熟悉一下正規表示式 現在就用最簡單的例子 print re.findall r 執行後結果為 這個相對來說還...