表標頭檔 #include(stdio.h)
定義函數 int sscanf (const char *str,const char * format,........);
函數說明 sscanf()會將參數str的字串根據參數format字串來轉換並格式化資料。格式轉換形式請參考scanf()。轉換後的結果存於對應的參數內。
傳回值 成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。
周星星的代碼:
#include <stdio.h></p><p>int main()<br />{<br /> const char* s = "iios/12DDWDFF@122";<br /> char buf[20];</p><p> sscanf( s, "%*[^/]/%[^@]", buf );<br /> printf( "%s/n", buf );</p><p> return 0;<br />}<br />
結果為:12DDWDFF
sscanf與scanf類似,都是用於輸入的,只是後者以螢幕(stdin)為輸入源,前者以固定字串為輸入源。
函數原型:
int scanf( const char *format [,argument]... );
其中的format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '/t' | '/n' | 非%符號},
註:{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。
width:寬度,一般可以忽略,用法如:
const char sourceStr[] = "hello, world";
char buf[10] = {0};
sscanf(sourceStr, "%5s", buf); //%5s,只取5個字元
cout << buf<< endl;
結果為:hello
{h | l | I64 | L}:參數的size,通常h表示單位元組size,I表示2位元組 size,L表示4位元組size(double例外),l64表示8位元組size。
type :這就很多了,就是%s,%d之類。
特別的:
%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目標參數中寫入值。如:
const char sourceStr[] = "hello, world";
char buf[10] = {0};
sscanf(sourceStr, "%*s%s", buf); //%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
cout << buf<< endl;
結果為:world
支援集合操作:
%[a-z] 表示匹配a到z中任一字元,貪婪性(儘可能多的匹配)
%[aB'] 匹配a、B、'中一員,貪婪性
%[^a] 匹配非a的任一字元,貪婪性
1. 常見用法。</p><p>以下是引用片段:<br /> charstr[512]={0};<br /> sscanf("123456","%s",str);<br /> printf("str=%s",str);</p><p> 2. 取指定長度的字串。如在下例中,取最大長度為4位元組的字串。</p><p>以下是引用片段:<br /> sscanf("123456","%4s",str);<br /> printf("str=%s",str);</p><p> 3. 取到指定字元為止的字串。如在下例中,取遇到空格為止字串。</p><p>以下是引用片段:<br /> sscanf("123456abcdedf","%[^]",str);<br /> printf("str=%s",str);</p><p> 4. 取僅包含指定字元集的字串。如在下例中,取僅包含1到9和小寫字母的字串。</p><p>以下是引用片段:<br /> sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);<br /> printf("str=%s",str);</p><p> 5. 取到指定字元集為止的字串。如在下例中,取遇到大寫字母為止的字串。</p><p>以下是引用片段:<br /> sscanf("123456abcdedfBCDEF","%[^A-Z]",str);<br /> printf("str=%s",str); </p><p>
搜集一些特殊用法:
%[ ] 的用法:%[ ]表示要讀入一個字元集合, 如果[ 後面第一個字元是”^”,則表示反意思。</p><p> [ ]內的字串可以是1或更多字元組成。Null 字元集(%[])是違反規定的,可</p><p> 導致不可預知的結果。%[^]也是違反規定的。</p><p>%[a-z] 讀取在 a-z 之間的字串,如果不在此之前則停止,如</p><p> char s[]="hello, my friend” ; // 注意: ,逗號在不 a-z之間</p><p> sscanf( s, “%[a-z]”, string ) ; // string=hello</p><p>%[^a-z] 讀取不在 a-z 之間的字串,如果碰到a-z之間的字元則停止,如</p><p> char s[]="HELLOkitty” ; // 注意: ,逗號在不 a-z之間</p><p> sscanf( s, “%[^a-z]”, string ) ; // string=HELLO</p><p>%*[^=] 前面帶 * 號表示不儲存變數。跳過合格字串。</p><p> char s[]="notepad=1.0.0.1001" ;</p><p> char szfilename [32] = "" ;</p><p> int i = sscanf( s, "%*[^=]", szfilename ) ; </p><p>// szfilename=NULL,因為沒儲存</p><p>int i = sscanf( s, "%*[^=]=%s", szfilename ) ; </p><p>// szfilename=1.0.0.1001</p><p>%40c 讀取40個字元</p><p>%[^=] 讀取字串直到碰到’=’號,’^’後面可以帶更多字元,如:</p><p> char s[]="notepad=1.0.0.1001" ;</p><p> char szfilename [32] = "" ;</p><p> int i = sscanf( s, "%[^=]", szfilename ) ; </p><p> // szfilename=notepad </p><p> 如果參數格式是:%[^=:] ,那麼也可以從 notepad:1.0.0.1001讀取notepad</p><p>