原文鏈接
表頭文件 #include(stdio.h)<stdio.h>
定義函數 int sscanf (const char *str,const char * format,........);
函數說明 sscanf()會將參數str的字符串根據參數format字符串來轉換並格式化數據。格式轉換形式請參考scanf()。轉換后的結果存於對應的參數內。
返回值 成功則返回參數數目,失敗則返回-1,錯誤原因存於errno中。
| 周星星的代碼:
#include <stdio.h>
int main() { const char* s = "iios/12DDWDFF@122"; char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf ); printf( "%s\n", buf );
return 0; }
結果為: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. 常見用法。
以下是引用片段: charstr[512]={0}; sscanf("123456","%s",str); printf("str=%s ",str);
2. 取指定長度的字符串。如在下例中,取最大長度為4字節的字符串。
以下是引用片段: sscanf("123456","%4s",str); printf("str=%s ",str);
3. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。
以下是引用片段: sscanf("123456abcdedf","%[^]",str); printf("str=%s ",str);
4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
以下是引用片段: sscanf("123456abcdedfBCDEF","%[1-9a-z]",str); printf("str=%s ",str);
5. 取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。
以下是引用片段: sscanf("123456abcdedfBCDEF","%[^A-Z]",str); printf("str=%s",str);
|
搜集一些特殊用法:
| %[ ] 的用法:%[ ]表示要讀入一個字符集合, 如果[ 后面第一個字符是”^”,則表示反意思。
[ ]內的字符串可以是1或更多字符組成。空字符集(%[])是違反規定的,可
導致不可預知的結果。%[^]也是違反規定的。
%[a-z] 讀取在 a-z 之間的字符串,如果不在此之前則停止,如
char s[]="hello, my friend” ; // 注意: ,逗號在不 a-z之間
sscanf( s, “%[a-z]”, string ) ; // string=hello
%[^a-z] 讀取不在 a-z 之間的字符串,如果碰到a-z之間的字符則停止,如
char s[]="HELLOkitty” ; // 注意: ,逗號在不 a-z之間
sscanf( s, “%[^a-z]”, string ) ; // string=HELLO
%*[^=] 前面帶 * 號表示不保存變量。跳過符合條件的字符串。
char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL,因為沒保存
int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001
%40c 讀取40個字符
%[^=] 讀取字符串直到碰到’=’號,’^’后面可以帶更多字符,如:
char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad
如果參數格式是:%[^=:] ,那么也可以從 notepad:1.0.0.1001讀取notepad
|
參考: