SSCANF用法詳解

2021-05-23 19:41:02 字數 4842 閱讀 2943

名稱:  sscanf() - 從乙個字串中讀進與指定格式相符的資料.

int sscanf( const char *, const char *, ...);

int scanf( const char *, ...);

#include

sscanf與scanf類似,都是用於輸入的,只是後者以鍵盤(stdin)為輸入源,前者以固定字串為輸入源。第乙個引數可以是乙個或多個 ]type | ' ' | '/t' | '/n' | 非%符號}

注:

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

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

3、width表示讀取寬度。

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

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

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

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

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

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

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。

sscanf的功能很類似於正規表示式, 但卻沒有正規表示式強大,所以如果對於比較複雜的字串處理,建議使用正規表示式.

用它來分隔類似這樣的字串2006:03:18:

int a, b, c;

/*sscanf("2006:03:18", "%d:%d:%d", a, b, c); */ /*錯誤方法, 要在變數a,b,c前加上取位址符, modified by huanmie_09*/

sscanf("2006:03:18", "%d:%d:%d", &a, &b, &c);

以及2006:03:18 - 2006:04:18:

char sztime1[16] = "", sztime2[16] = "";

sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

但是後來,我需要處理2006:03:18-2006:04:18

僅僅是取消了『-』兩邊的空格,卻打破了%s對字串的界定。

我需要重新設計乙個函式來處理這樣的情況?這並不複雜,但是,為了使所有的**都有統一的風格,我需要改動很多地方,把已有的sscanf替換成我自己的分割函式。我以為我肯定需要這樣做,並伴隨著對sscanf的強烈不滿而入睡;一覺醒來,發現其實不必。

format-type中有%這樣的type field。如果讀取的字串,不是以空格來分隔的話,就可以使用%。

%類似於乙個正規表示式。[a-z]表示讀取a-z的所有字元,[^a-z]表示讀取除a-z以外的所有字元。

所以那個問題也就迎刃而解了:

sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

在softmse (jake) 的問題貼http://community.csd(去掉我)n.n(去掉我)et/expert/topic/4843/4843294.xml?temp=.4321558中 ,給出了乙個很cool的sscanf用例,而後通過學習,發現sscanf真棒,現做一總結。

原問題:

iios/12ddwdff@122

獲取/和@之間的字串怎麼做

c程式裡面有什麼函式嗎?

**:

#include

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可以是乙個或多個 ]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的任意字元,貪婪性

是不是感覺眼熟了啊,不錯,這和正規表示式很相似,而且仍然支援過濾,即可以有%*[a-z].如:

例子回顧:

const char* s = "iios/12ddwdff@122";

char buf[20];

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

printf( "%s/n", buf );

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

sscanf("123456 abcdedf", "%[^ ]", buf);

printf("%s/n", buf);

結果為:123456

所以**總結應該為:

const char* s = "iios/12ddwdff@122";

char buf[20];

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

printf( "%s/n", buf );

先將 "iios/"過濾掉,再將到字元'@'為止的一串12ddwdff(由例3可得此串到@為止,把@122捨掉)內容即是:12ddwdff送到buf中,得到結果。

sscanf 用法詳解

名稱 sscanf 從乙個字串中讀進與指定格式相符的資料.函式原型 int sscanf string str,string fmt,mixed var1,mixed var2 int scanf const char format argument 說明 sscanf與scanf類似,都是用於輸入...

sscanf用法詳解

sscanf是從字串中讀取指定整型,浮點型及其他指定資料型別的函式 sscanf和scanf的不同是,前者是從字串中讀取。後者是從鍵盤輸入中讀取 sscanf的定義 int sscanf const char str,const char format,這就是說括號裡面填寫的必須是指標,整型變數也需...

sscanf函式用法詳解

sscanf函式用法詳解 名稱 sscanf 從乙個字串中讀進與指定格式相符的資料.函式原型 int sscanf string str,string fmt,mixed var1,mixed var2 int scanf const char format argument 說明 sscanf與s...