1. 程式人生 > >C語言的sscanf()函式小結

C語言的sscanf()函式小結

作用: 

從字串讀取格式化輸入

函式宣告:

int sscanf(const char *str, const char *format, ...)

 引數說明:

str  C 字串,是函式檢索資料的來源
format C 字串,由空格字元、非空格字元 和 format 說明符組成,指定讀入的格式
說明符形式為 [=%[*][width][modifiers]type=],具體如下
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

感謝!