sscanf函式的用法

2021-09-26 04:12:06 字數 4251 閱讀 8087

函式原型:

int sscanf(

const

char * src, const

char *format, ...);

int scanf( const

char *format, ...);

這兩個函式很相似,只是第乙個函式以src作為輸入,而第二個函式以標準輸入stdin讀取輸入;

format 是格式控制字串,它包含控制字元(如:%d,%i,%s等),空白字元(如:空格、製表符\t、回車換行符\n 或其連續組合)以及非空白字元;

...是一組指標變數,是上述函式用來儲存結果值的;

返回值為被成功賦值的指標變數的個數,如果該函式發生錯誤,則返回eof(-1)。

格式控制format:

format可以是乙個或多個 ]type | 空白字元|非空白符號}

該公式中符號解釋如下:

:表示a,b,c中選一或幾個;

[d]:表示可以有d也可以沒有d;

* :亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此資料不讀入. (也就是不把此資料讀入引數中) ,用法如:

view plainprint?

const

char sourcestr = "

hello, world

";

char buf[10] =;

sscanf(sourcestr,

"%*s%s

", buf); //

%*s表示第乙個匹配到的%s被過濾掉,即hello被過濾了

cout << buf<結果為:world

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

view plainprint?

const

char sourcestr = "

hello, world

";

char buf[10] =;

sscanf(sourcestr,

"%5s

", buf); //

%5s,只取5個字元

cout

<< buf<結果為:hello

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

type:即為控制字元如:d, i, f, s, p, 及集合[ ],(注意%號寫在了最前面了,這裡不能再加乙個%號了。) 需特別注意和說明的控制符是集合%[ ]:

view plainprint?

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

%[ab'

] 匹配a、b、

'中一員,貪婪性

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

例如取遇到空格為止字串:

view plainprint?sscanf(

"123456 abcdedf

", "

%[^ ]

", buf);

printf(

"%s\n

", buf);

結果為:

123456

再如:view plainprint?

const

char* s = "

iios/12ddwdff@122

";

char buf[20

];

sscanf( s,

"%*[^/]/%[^@]

", buf );

printf(

"%s\n

", buf );

結果為:12ddwdff

先將 "

iios/

"過濾掉,再將到字元"

mailto:'@'

">'@'

為止的一串12ddwdff

空白字元:

'', '

\n', '\t'

等;非空白字元:即一般字元。

格式匹配過程:

該函式從源(src 或stdin)的前面順序讀取乙個或一段字元,並將其與順序取自格式控制字串中的字元或字串進行比較匹配:

當遇到乙個空白字元時,則不比較而跳過(空格呢?);

當遇到乙個非空白字元時,進行比較但不存進指標變數內;

不能匹配呢?

特別注意的是:

常見例子: 1

. 常見用法。

char buf[512

] ;sscanf(

"123456

", "

%s", buf);//

此處buf是陣列名,它的意思是將123456以%s的形式存入buf中!

printf("

%s\n

", buf);

結果為:

123456

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

sscanf(

"123456

", "

%4s"

, buf);

printf(

"%s\n

", buf);

結果為:

1234

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

sscanf(

"123456 abcdedf

", "

%[^ ]

", buf);

printf(

"%s\n

", buf);

結果為:

123456

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

sscanf(

"123456abcdedfbcdef

", "

%[1-9a-z]

", buf);

printf(

"%s\n

", buf);

結果為:123456abcdedf

當輸入:

sscanf(

"123456abcdedfbcdef

","%[1-9a-z]

",buf);

printf(

"%s\n

",buf);

結果為:

123456

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

sscanf(

"123456abcdedfbcdef

", "

%[^a-z]

", buf);

printf(

"%s\n

", buf);

結果為:123456abcdedf

6、給定乙個字串iios/12ddwdff@122,獲取 / 和 @ 之間的字串,先將 "

iios/

"過濾掉,再將非'@'

的一串內容送到buf中

sscanf(

"iios/12ddwdff@122

", "

%*[^/]/%[^@]

", buf);

printf(

"%s\n

", buf);

結果為:12ddwdff

7、給定乙個字串"

hello, world」,僅保留world。(注意:「,」之後有一空格)

sscanf(「hello, world」, "

%*s%s

", buf);

printf(

"%s\n

", buf);

結果為:world

%*s表示第乙個匹配到的%s被過濾掉,即hello被過濾了

如果沒有空格則結果為null。

8.處理2006:03:18 - 2006:04:18(『-』兩邊有空格)和2006:03:18-2006:04:18(『-』兩邊無空格):

前者:char sztime1[16] = "", sztime2[16] = ""

;sscanf(

"2006:03:18 - 2006:04:18

", "

%s - %s

", sztime1, sztime2);

後者:char sztime1[16] = "", sztime2[16] = ""

;sscanf(

"2006:03:18 - 2006:04:18

", "

%[0-9,:]-%[0-9,:]

", sztime1, sztime2);

sscanf 函式用法

read formatted data from a string.intsscanf constchar buffer,constchar format argument intswscanf constwchar t buffer,constwchar t format argument a f...

sscanf函式的用法

sscanf與 scanf 類似,都是用於輸入的,只是後者以鍵盤 stdin 為輸入源,前者以固定字串為輸入源。1.常見用法。char buf 512 sscanf 123456 s buf 此處buf是 陣列名,它的意思是將123456以 s的形式存入buf中 printf s n buf 結果為...

sscanf 函式的用法

來自 sscanf 名稱 sscanf 從乙個字串中讀進與指定格式相符的資料.函式原型 int sscanf const char const char 標頭檔案 include 說明 sscanf與scanf類似,都是用於輸入的,只是後者以鍵盤 stdin 為輸入源,前者以固定字串為輸入源。例子 ...