最近遇到了解析配置的問題,用正規表示式感覺大題小做,使用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.只能為中文 有...