sscanf 函式中format問題

2021-06-18 04:27:53 字數 3184 閱讀 2680

函式原型: 

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可以是乙個或多個 ]type | ' ' | '\t' | '\n' | 非%符號}

支援集合操作: (集合預設處理字串後不用加s)

%[a-z] 結果只儲存a到z中任意字元 

%[ab'] 匹配a、b、'中一員

%[^a] 匹配從字串開始到非a的任意字元

%*[a-z]

其中集合操作也支援*過濾。

:引數的size,通常h表示單位元組size,i表示2位元組 size,

l表示4位元組size(double例外),l64表示8位元組size。

例子: 

1. 常見用法。 

char buf[512] = ; 

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的值不定。

sscanf 函式用法

read formatted data from a string.intsscanf constchar buffer,constchar format argument intswscanf constwchar t buffer,constwchar t format argument a f...

sscanf 函式小結

1.常見用法。char buf 512 sscanf 123456 s buf 此處buf是陣列名,它的意思是將123456以 s的形式存入buf中!printf s n buf 結果為 123456 2.取指定長度的字串。如在下例中,取最大長度為4位元組的字串。sscanf 123456 4s b...

sscanf()函式總結

sscanf 的作用 從乙個字串中讀進與指定格式相符的資料.原型 int sscanf const char str,const char format,說明 sscanf 會將引數str的字串根據引數format字串來轉換並格式化資料。轉換後的結果存於對應的引數內。成功則返回引數數目,失敗則返回0...