相關
sscanf()-從一個字符串中讀進與指定格式相符的數據。
函數原型:intsscanf(constchar*,constchar*,);intsscanf(constchar*buffer,constchar*format,[argument]);buffer存儲的數據format格式控制字符串argument選擇性設定字符串sscanf會從buffer裡讀進數據,依照argument的設定将數據寫回。
返回值
成功則返回參數數目,失敗則返回-1,錯誤原因存于errno中。
經多次測試,在linux系統中成功返回的是全部參數值減2,例如:sscanf("123","%d%d%d",buf1,buf2,buf3);成功調用返回值為3,即buf的數量(總參數個數減前兩個)。
基本說明
sscanf與scanf類似,都是用于輸入的,隻是後者以鍵盤(stdin)為輸入源,前者以固定字符串為輸入源。
第一個參數可以是一個或多個{%[*][width][{h|I|I64|L}]type|''|'t'|'n'|非%符号}。
注:
1、*亦可用于格式中,(即%*d和%*s)加了星号(*)表示跳過此數據不讀入。(也就是不把此數據讀入參數中)
2、{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。
3、width表示讀取寬度。
4、{h|l|I64|L}:參數的size,通常h表示單字節size,I表示2字節size,L表示4字節size(double例外),l64表示8字節size。
5、type:這就很多了,就是%s,%d之類。
6、特别的:%*[width][{h|l|I64|L}]type表示滿足該條件的被過濾掉,不會向目标參數中寫入值。
失敗返回0,否則返回格式化的參數個數。
支持集合
%[a-z]表示匹配a到z中任意字符,貪婪性(盡可能多的匹配)。
%[aB']匹配a、B、'中一員,貪婪性。
%[^a]匹配非a的任意字符,并且停止讀入,貪婪性。
例子
1、常見用法。
charbuf;
sscanf("123456","%s",buf);//此處buf是數組名,它的意思是将123456以%s的形式存入buf中!
printf("%sn",buf);
結果為:123456
2、取指定長度的字符串。如在下例中,取最大長度為4字節的字符串。
sscanf("123456","%4s",buf);
printf("%sn",buf);
結果為:1234
3、取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。
sscanf("123456abcdedf","%[^]",buf);
printf("%sn",buf);
結果為:123456
4、取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
sscanf("123456abcdedfBCDEF","%[1-9a-z]",buf);
printf("%sn",buf);
結果為:123456abcdedf
當輸入:
sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%sn",buf);
結果為:123456
5、取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。
sscanf("123456abcdedfBCDEF","%[^A-Z]",buf);
printf("%sn",buf);
結果為:123456abcdedf
6、給定一個字符串iios/12DDWDFF@122,獲取/和@之間的字符串,先将"iios/"過濾掉,再将非'@'的一串内容送到buf中。
sscanf("iios/12DDWDFF@122","%*[^/]/%[^@]",buf);
printf("%sn",buf);
結果為:12DDWDFF
7、給定一個字符串"hello,world",僅保留world。(注意:","之後有一空格,%s遇空格停止,加*則是忽略第一個讀到的字符串)
sscanf("hello,world","%*s%s",buf);
printf("%sn",buf);
結果為:world
%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了。
如果沒有空格則結果為NULL。