sscanf()函數中format問題

sscanf() -格式化輸入(從指定字符串中把符合指定格式的數據存放到對相應的參數中)

函數原型: 
int fscanf ( FILE *stream, char const *format, . . . );
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' | 非%符號}
支持集合操作: (集合默認處理字符串後不用加s)
     %[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。
例子: 
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
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
下面這個還有意思仔細理解下:
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); 
    printf("%s\n", buf1);
結果:buf1=iios ;
         buf2=/12DDWDFF       | sscanf=2
由此我們可以得出結論,format中格式符%是從前一個格式符%處理到的字符下一個字符開始處理字符串,而不是從新開始處理字符串。
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了。
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); 
9、fprintf(fp,"%s %s",a,b);  讀取兩個字符串分別賦值給a,b
     fprintf(fp,"%s,%s",a,b);  讀取一個字符串然後按format賦值給a,但是b的值不定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章