scanf,sscanf高階用法

2021-05-17 12:04:18 字數 3616 閱讀 9050

最近遇到了解析配置的問題,用正規表示式感覺大題小做,使用sscanf因只會用基本用法,感覺功能不夠,上網搜了下,解析起來不費吹灰之力,**也很簡潔。

原帖出處不詳,網上到處是,我做了點修改

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

函式原型:

int  sscanf( string str, string fmt, mixed var1, mixed var2 ... );

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

說明:sscanf與scanf類似,都是用於輸入的,只是後者以螢幕(stdin)為輸入源,前者以固定字串為輸入源。

其中的format可以是乙個或多個

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

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

3、width表示讀取寬度。

4、引數的size: 常用的有hh表示單位元組size,h表示2位元組 size,其他詳見man sscanf或msdn

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

控制字元 說明 

%c  乙個單一的字元 

%d  乙個十進位制整數 

%i  乙個整數 

%e, %f, %g 乙個浮點數 

%o  乙個八進位制數 

%s  乙個字串 

%x  乙個十六進製制數 

%p  乙個指標 

%n  乙個等於讀取字元數量的整數 

%u  乙個無符號整數 

%  乙個字符集 

%%  乙個精度符

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

支援集合操作:

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

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

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

還是用例子說話:

#include 

int main()

;//1. 常見用法。

sscanf("123456 asdf", "%s", buf);

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

printf("123456 expect! %%s/n/n");

//結果為:123456

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

sscanf("123456 ", "%4s", buf);

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

printf("1234 expect! %%4s/n/n");

//結果為:1234

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

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

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

printf("123456 expect! %%[^ ]/n/n");

//結果為:123456

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

sscanf("123456abcdedfbcdefxyz", "%[1-9a-z]", buf);

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

printf("123456abcdedf expect! %%[1-9a-z]/n/n");

//結果為:123456abcdedf

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

sscanf("123456 abcdedfbcdefxyz", "%[^a-z]", buf);

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

printf("123456 abcdedf expect! %%[^a-z]/n/n");

//結果為:123456 abcdedf

//6、給定乙個字串iios/12ddwdff@122,獲取 / 和 @ 之間的字串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中

sscanf("iios/12ddwdff@122", "%*[^/]/%[^@]", buf);

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

printf("12ddwdff expect! %%*[^/]/%%[^@]/n/n");

//結果為:12ddwdff

//7、給定乙個字串「「hello, world」,僅保留world。(注意:「,」之後有一空格)

sscanf("hello, world",  "%*s%s",  buf);

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

printf("world expect! %%*s%%s/n/n");

//結果為:world 

//8、引數size的控制

unsigned char m[6] = ;

int n = 0;

// sscanf 返回輸入了幾個引數

n = sscanf("010203040506", "%hhx%hhx%hhx%hhx%hhx%hhx", &m[0], &m[1], &m[2], &m[3], &m[4], &m[5]);

printf("hhx: %d :%02x%02x%02x%02x%02x%02x/n",n, m[0], m[1],m[2],m[3], m[4], m[5]);

// 結果 n 為 1, 因為 hhx 把所有字串作為乙個數字,後面的都沒有輸入

n = sscanf("010203040506", "%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx", &m[0], &m[1], &m[2], &m[3], &m[4], &m[5]);

printf("2hhx: %d :%02x%02x%02x%02x%02x%02x/n",n, m[0], m[1],m[2],m[3], m[4], m[5]);

// 結果 n 為 6, 加了2,之後限制每次hhx只匹配2個字元,所以每個都被輸入

n = sscanf("010203040506", "%02x%02x%02x%02x%02x%02x", &m[0], &m[1], &m[2], &m[3], &m[4], &m[5]);

printf(" 02x: %d :%02x%02x%02x%02x%02x%02x/n",n, m[0], m[1],m[2],m[3], m[4], m[5]);

// 0 是填充字元,2表示匹配2個字元,x表示乙個十六進製制數

// 注意:編譯有warning,有時結果是正確的(跟具體的編譯器、編譯選項、編譯環境有關),但x表示4個位元組,大於被輸入物件的大小

// 這會導致相鄰的3個位元組會被覆蓋!!這會導致分配在相鄰記憶體的變數被清0

//http://blog.csdn.net/rainharder/archive/2008/09/27/2989675.aspx裡面有個覆蓋的例子

return 0;}

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

個人認為正規表示式略顯複雜,還是使用sscanf方便,搞不定再用正規表示式

scanf sscanf 格式控制串的用法

執行,輸入 5656high後,結果是 5656。通過執行可以發現它的作用是 如果輸入的字元屬於方括號內字串中某個字元,那麼就提取該字元 如果一經發現不屬於就結束提取。該方法會自動加上乙個字串結束符到已經提取的字元後面。注意 方括號兩邊不能空格,如 scanf 1234567890 string s...

python高階用法 Python高階用法

python高階用法 三元表示式 x 10 y 20 print x if x y else y x 100 y 20 print x if x y else y 列表推導式和生成器 列表推導式 print i for i in range 10 print i 2 for i in range 1...

input高階用法

1.取消按鈕按下時的虛線框 在input裡新增屬性值 hidefocus 或者 hidefocus true 2.唯讀文字框內容 在input裡新增屬性值 readonly 3.防止退後清空的text文件 可把style內容做做為類引用 4.enter鍵可以讓游標移到下乙個輸入框 5.只能為中文 有...