sscanf() -格式化輸入(從指定字符串中把符合指定格式的數據存放到對相應的參數中)
函數原型:
int fscanf ( FILE *stream, char const *format, . . . );
int sscanf( string str, string format, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
int sscanf( string str, string format, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
說明:
返回值:失敗返回0 ,否則返回格式化的參數個數
f-file; s-string
fscanf():以指定文件爲輸入源
sscanf():以固定字符串爲輸入源
scanf():以標準(stdin)爲輸入源,默認輸入設備鍵盤
其中的format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號}
其中的format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號}
支持集合操作: (集合默認處理字符串後不用加s)
%[a-z] 結果只保存a到z中任意字符
%[aB'] 匹配a、B、'中一員
%[^a] 匹配從字符串開始到非a的任意字符
%[a-z] 結果只保存a到z中任意字符
%[aB'] 匹配a、B、'中一員
%[^a] 匹配從字符串開始到非a的任意字符
%*[a-z]
其中集合操作也支持*過濾。
{h|I|I64|L}:參數的size,通常h表示單字節size,I表示2字節 size,
L表示4字節size(double例外),l64表示8字節size。
L表示4字節size(double例外),l64表示8字節size。
例子:
1. 常見用法。
char buf[512] = {0};
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
結果爲:123456 | sscanf=1;
1. 常見用法。
char buf[512] = {0};
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
結果爲:123456 | sscanf=1;
2. 取指定長度的字符串。如在下例中,取最大長度爲4字節的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
結果爲:1234 |sscanf=1
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
結果爲:1234 |sscanf=1
3. 取到指定字符爲止的字符串。如在下例中,取遇到空格爲止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
結果爲:123456 |sscanf=1
4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
結果爲:123456abcdedf |sscanf=1
5. 取到指定字符集爲止的字符串。如在下例中,取遇到大寫字母爲止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
結果爲:123456abcdedf |sscanf=1
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
結果爲:123456 |sscanf=1
4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
結果爲:123456abcdedf |sscanf=1
5. 取到指定字符集爲止的字符串。如在下例中,取遇到大寫字母爲止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
結果爲:123456abcdedf |sscanf=1
下面這個還有意思仔細理解下:
6、給定一個字符串iios/12DDWDFF@122,獲取
/ 和 @ 之間的字符串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
結果爲:12DDWDFF |sscanf=1
sscanf("iios/12DDWDFF@122", "%[^/]/%[^@]", buf1,buf2);
printf("%s\n", buf1);
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
結果爲:12DDWDFF |sscanf=1
sscanf("iios/12DDWDFF@122", "%[^/]/%[^@]", buf1,buf2);
printf("%s\n", buf1);
printf("%s\n", buf1);
結果:buf1=iios ;
buf2=/12DDWDFF |
sscanf=2
由此我們可以得出結論,format中格式符%是從前一個格式符%處理到的字符下一個字符開始處理字符串,而不是從新開始處理字符串。
7、給定一個字符串““hello, world”,僅保留world。(注意:“,”之後有一空格)
7、給定一個字符串““hello, world”,僅保留world。(注意:“,”之後有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
結果爲:world |sscanf=1
%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
如果沒有空格則結果爲NULL。
8、
char *s="1try234delete5"
則:
sscanf(s, "1%[^2]234%[^5]", s1, s2); |sscanf=2
scanf的format中出現的非轉換字符(%之前或轉換字符之後的字符),即此例中的1234用來跳過輸入中的相應字符;
‘[]’的含義與正則表達式中相同,表示匹配其中出現的字符序列;^表示相反。使用[ ]時接收輸入的變量必須是有足夠存儲空間的char、signed char、unsigned char數組。記住[也是轉換字符,所以沒有s了。
printf("%s\n", buf);
結果爲:world |sscanf=1
%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
如果沒有空格則結果爲NULL。
8、
char *s="1try234delete5"
則:
sscanf(s, "1%[^2]234%[^5]", s1, s2); |sscanf=2
scanf的format中出現的非轉換字符(%之前或轉換字符之後的字符),即此例中的1234用來跳過輸入中的相應字符;
‘[]’的含義與正則表達式中相同,表示匹配其中出現的字符序列;^表示相反。使用[ ]時接收輸入的變量必須是有足夠存儲空間的char、signed char、unsigned char數組。記住[也是轉換字符,所以沒有s了。
8、分割以某字符標記的字符串。()
char test[]="111,222,333,444,555,666,777";
char s1[4],s2[4],s3[4],s4[4],s5[4],s6[4],s7[4];
sscanf(test,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",s1,s2,s3,s4,s5,s6,s7);
printf("sssa1=%s\n",s1);
printf("sssa2=%s\n",s2);
printf("sssa3=%s\n",s3);
printf("sssa4=%s\n",s4);
printf("sssa5=%s\n",s5);
printf("sssa6=%s\n",s6);
printf("sssa7=%s\n",s7);
char s1[4],s2[4],s3[4],s4[4],s5[4],s6[4],s7[4];
sscanf(test,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",s1,s2,s3,s4,s5,s6,s7);
printf("sssa1=%s\n",s1);
printf("sssa2=%s\n",s2);
printf("sssa3=%s\n",s3);
printf("sssa4=%s\n",s4);
printf("sssa5=%s\n",s5);
printf("sssa6=%s\n",s6);
printf("sssa7=%s\n",s7);
9、fprintf(fp,"%s %s",a,b); 讀取兩個字符串分別賦值給a,b
fprintf(fp,"%s,%s",a,b); 讀取一個字符串然後按format賦值給a,但是b的值不定。