....sscanf() - 從一個字符串中讀進與指定格式相符的數據. ios
....int sscanf( const char *, const char *, ...);
....int sscanf(const char *buffer,const char *format[,argument ]...);
....buffer 存儲的數據
....format 格式控制字符串
....argument 選擇性設定字符串
....sscanf會從buffer裏讀進數據,依照argument的設定將數據寫回。正則表達式
....#include<stdio.h>數組
....成功則返回參數數目,失敗則返回-1,錯誤緣由存於errno中。函數
....sscanf與scanf相似,都是用於輸入的,只是後者以鍵盤(stdin)爲輸入源,前者以固定字符串爲輸入源。學習
第一個參數能夠是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號} * 亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入. (也就是不把此數據讀入參數中)spa
{a|b|c}表示a,b,c中選一,[d],表示能夠有d也能夠沒有d.net
width表示讀取寬度。code
{h | l | I64 | L}:參數的size,一般h表示單字節size,I表示2字節 size,L表示4字節size(double例外),l64表示8字節size。orm
type :這就不少了,就是%s,%d之類。字符串
特別的:%*[width] [{h | l | I64 | L}]type 表示知足該條件的被過濾掉,不會向目標參數中寫入值失敗返回0 ,不然返回格式化的參數個數
支持集合操做:
%[a-z] 表示匹配a到z中任意字符,貪婪性(儘量多的匹配)
%[aB'] 匹配a、B、'中一員,貪婪性
%[^a] 匹配非a的任意字符,貪婪性
例子:
常見用法。
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
六、給定一個字符串iios/12DDWDFF@122 ,獲取 / 和 @ 之間的字符串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
結果爲:12DDWDFF
七、給定一個字符串「hello, world」,僅保留world。(注意:「,」以後有一空格,%s遇空格中止,加*則是忽略第一個讀到的字符串)
sscanf(「hello, world」, "%*s%s", buf);
printf("%s\n", buf);
結果爲:world
%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
若是沒有空格則結果爲NULL。
sscanf的功能很相似於正則表達式, 但卻沒有正則表達式強大,因此若是對於比較複雜的字符串處理,建議使用正則表達式.
在softmse (Jake) 的問題貼中 ,給出了一個很cool的sscanf用例,然後經過學習,發現sscanf真棒,現作一總結。
原問題:
iios/12DDWDFF@122
獲取/和@之間的字符串怎麼作
C程序裏面有什麼函數嗎?
代碼:
#include <stdio.h> int main() { const char* s = "iios/12DDWDFF@122"; char buf[20]; sscanf( s, "%*[^/]/%[^@]", buf ); printf( "%s\n", buf ); return 0; } 結果爲:12DDWDFF