函式原型:int sscanf(
const
char * src, const
char *format, ...);
int scanf( const
char *format, ...);
這兩個函式很相似,只是第乙個函式以src作為輸入,而第二個函式以標準輸入stdin讀取輸入;
format 是格式控制字串,它包含控制字元(如:%d,%i,%s等),空白字元(如:空格、製表符\t、回車換行符\n 或其連續組合)以及非空白字元;
...是一組指標變數,是上述函式用來儲存結果值的;
返回值為被成功賦值的指標變數的個數,如果該函式發生錯誤,則返回eof(-1)。
格式控制format:
format可以是乙個或多個 ]type | 空白字元|非空白符號}
該公式中符號解釋如下:
:表示a,b,c中選一或幾個;
[d]:表示可以有d也可以沒有d;
* :亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此資料不讀入. (也就是不把此資料讀入引數中) ,用法如:
view plainprint?
const
char sourcestr = "
hello, world
";
char buf[10] =;
sscanf(sourcestr,
"%*s%s
", buf); //
%*s表示第乙個匹配到的%s被過濾掉,即hello被過濾了
cout << buf<結果為:world
width:寬度,一般可以忽略,用法如:
view plainprint?
const
char sourcestr = "
hello, world
";
char buf[10] =;
sscanf(sourcestr,
"%5s
", buf); //
%5s,只取5個字元
cout
<< buf<結果為:hello
:引數的size,通常h表示單位元組size,i表示2位元組 size,l表示4位元組size(double例外),l64表示8位元組size;
type:即為控制字元如:d, i, f, s, p, 及集合[ ],(注意%號寫在了最前面了,這裡不能再加乙個%號了。) 需特別注意和說明的控制符是集合%[ ]:
view plainprint?
%[a-z] 表示匹配a到z中任意字元,貪婪性(盡可能多的匹配)
%[ab'
] 匹配a、b、
'中一員,貪婪性
%[^a] 匹配非a的任意字元,貪婪性
例如取遇到空格為止字串:
view plainprint?sscanf(
"123456 abcdedf
", "
%[^ ]
", buf);
printf(
"%s\n
", buf);
結果為:
123456
再如:view plainprint?
const
char* s = "
iios/12ddwdff@122
";
char buf[20
];
sscanf( s,
"%*[^/]/%[^@]
", buf );
printf(
"%s\n
", buf );
結果為:12ddwdff
先將 "
iios/
"過濾掉,再將到字元"
mailto:'@'
">'@'
為止的一串12ddwdff
空白字元:
'', '
\n', '\t'
等;非空白字元:即一般字元。
格式匹配過程:
該函式從源(src 或stdin)的前面順序讀取乙個或一段字元,並將其與順序取自格式控制字串中的字元或字串進行比較匹配:
當遇到乙個空白字元時,則不比較而跳過(空格呢?);
當遇到乙個非空白字元時,進行比較但不存進指標變數內;
不能匹配呢?
特別注意的是:
常見例子: 1
. 常見用法。
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
6、給定乙個字串iios/12ddwdff@122,獲取 / 和 @ 之間的字串,先將 "
iios/
"過濾掉,再將非'@'
的一串內容送到buf中
sscanf(
"iios/12ddwdff@122
", "
%*[^/]/%[^@]
", buf);
printf(
"%s\n
", buf);
結果為:12ddwdff
7、給定乙個字串"
hello, world」,僅保留world。(注意:「,」之後有一空格)
sscanf(「hello, world」, "
%*s%s
", buf);
printf(
"%s\n
", buf);
結果為:world
%*s表示第乙個匹配到的%s被過濾掉,即hello被過濾了
如果沒有空格則結果為null。
8.處理2006:03:18 - 2006:04:18(『-』兩邊有空格)和2006:03:18-2006:04:18(『-』兩邊無空格):
前者:char sztime1[16] = "", sztime2[16] = ""
;sscanf(
"2006:03:18 - 2006:04:18
", "
%s - %s
", sztime1, sztime2);
後者:char sztime1[16] = "", sztime2[16] = ""
;sscanf(
"2006:03:18 - 2006:04:18
", "
%[0-9,:]-%[0-9,:]
", sztime1, sztime2);
sscanf 函式用法
read formatted data from a string.intsscanf constchar buffer,constchar format argument intswscanf constwchar t buffer,constwchar t format argument a f...
sscanf函式的用法
sscanf與 scanf 類似,都是用於輸入的,只是後者以鍵盤 stdin 為輸入源,前者以固定字串為輸入源。1.常見用法。char buf 512 sscanf 123456 s buf 此處buf是 陣列名,它的意思是將123456以 s的形式存入buf中 printf s n buf 結果為...
sscanf 函式的用法
來自 sscanf 名稱 sscanf 從乙個字串中讀進與指定格式相符的資料.函式原型 int sscanf const char const char 標頭檔案 include 說明 sscanf與scanf類似,都是用於輸入的,只是後者以鍵盤 stdin 為輸入源,前者以固定字串為輸入源。例子 ...