C語言的sscanf()函式小結
阿新 • • 發佈:2018-12-09
作用:
從字串讀取格式化輸入
函式宣告:
int sscanf(const char *str, const char *format, ...)
引數說明:
str | C 字串,是函式檢索資料的來源 |
format | C 字串,由空格字元、非空格字元 和 format 說明符組成,指定讀入的格式 |
width | 這指定了在當前讀取操作中讀取的最大字元數。 |
modifiers | 為對應的附加引數所指向的資料指定一個不同於整型(針對 d、i 和 n)、無符號整型(針對 o、u 和 x)或浮點型(針對 e、f 和 g)的大小: h :短整型(針對 d、i 和 n),或無符號短整型(針對 o、u 和 x) l :長整型(針對 d、i 和 n),或無符號長整型(針對 o、u 和 x),或雙精度型(針對 e、f 和 g) L :長雙精度型(針對 e、f 和 g) |
type | 指定了要被讀取的資料型別以及資料讀取方式。包括c(單個字元:讀取下一個字元),d(十進位制整數),s(字串。這將讀取連續字元,直到遇到一個空格字元) |
返回值
如果成功,該函式返回成功匹配和賦值的個數(以空字元分隔開的個數)。如果到達檔案末尾或發生讀錯誤,則返回 EOF。
注意:匹配物件以空字元分隔 (空格,回車,換行)
常用示例
1.常規讀入
#include<iostream> #include<string.h> #include<stdlib.h> using namespace std; int main(){ int ret; int digit; char buf1[255]; char buf2[255]; char buf3[255]; char *string="hello tomomrrow! 123/456"; ret = sscanf(string,"%s %s %d",buf1,buf2,&digit); cout<<string<<endl; cout<<"返回值ret="<<ret<<endl <<"buf1="<<buf1<<endl <<"buf2="<<buf2<<endl <<"digit="<<digit<<endl; }
執行結果:
注意,為方便起見,下面示例程式碼將省略標頭檔案的引入和變數宣告,其所需標頭檔案及變數同上
2.讀取指定長度的字串(%長度s)
char *string="hello tomorrow! 123/456";
ret = sscanf(string,"%4s",buf1);
cout<<string<<endl;
cout<<"返回值ret="<<ret<<endl
<<"buf1="<<buf1<<endl;
執行結果:
注意:讀取的長度小於等於成功匹配的第一個字元段長度,如上例中,若取前7位,只能讀入hello,因為成功匹配的第一個欄位最長就是hello。
3.讀取到指定字元為止的字串(%[^該指定字元])
char *string="hello tomorrow! 123/456";
ret = sscanf(string,"%[^!]",buf1);
cout<<string<<endl;
cout<<"返回值ret="<<ret<<endl
<<"buf1="<<buf1<<endl;
執行結果:
4.讀取到指定字符集為止(%[^字符集起始字元-字符集終止字元])
char *string="hello tomorrow! 123/456";
ret = sscanf(string,"%[^5-9]",buf1);
cout<<string<<endl;
cout<<"返回值ret="<<ret<<endl
<<"buf1="<<buf1<<endl;
執行結果:
5.取僅包含指定字符集的字串(%[起始字元-終止字元])
char *string="hello TOMORROW 123456";
ret = sscanf(string,"%[a-z] %[A-Z] %[0-9]",buf1,buf2,buf3);
cout<<string<<endl;
cout<<"返回值ret="<<ret<<endl
<<"buf1="<<buf1<<endl
<<"buf2="<<buf2<<endl
<<"buf3="<<buf3<<endl;
執行結果:
6.獲取指定字串中間的字串(%*[^首指定字元]<%[^尾指定字元])
char *string="hello<tomorrow>123456";
ret = sscanf(string,"%*[^<]<%[^>]",buf1);
cout<<string<<endl;
cout<<"返回值ret="<<ret<<endl
<<"buf1="<<buf1<<endl;
執行結果:
7.指定要跳過的位元組(在兩個說明符中間宣告該位元組)
char *string="hello tomorrow 123456";
ret = sscanf(string,"%[a-z] tomorrow %[0-9]",buf1,buf2);
cout<<string<<endl;
cout<<"返回值ret="<<ret<<endl
<<"buf1="<<buf1<<endl
<<"buf2="<<buf2<<endl;
執行結果:
8.分割以某字元隔開的字串(^加該字元,中括號後再跟一個該字元)
char *string="hello,tomorrow,123456";
ret = sscanf(string,"%[^,],%[^,],%[^,]",buf1,buf2,buf3);
cout<<string<<endl;
cout<<"返回值ret="<<ret<<endl
<<"buf1="<<buf1<<endl
<<"buf2="<<buf2<<endl
<<"buf3="<<buf3<<endl;
執行結果:
9.過濾掉不想提取的字串(%*s)
char *string="hello tomorrow 123456";
ret = sscanf(string,"%s %*s %s",buf1,buf2,buf3);
cout<<string<<endl;
cout<<"返回值ret="<<ret<<endl
<<"buf1="<<buf1<<endl
<<"buf2="<<buf2<<endl
<<"buf3="<<buf3<<endl;
執行結果:
參考於以下連結:
1.https://blog.csdn.net/gzshun/article/details/7081736
2.http://www.runoob.com/cprogramming/c-function-sscanf.html
感謝!