一、前言
為赤壁等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及赤壁網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、赤壁網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
本節(jié),我們將學(xué)習(xí)C語(yǔ)言庫(kù)函數(shù)sscanf()的使用,使用sscanf可以快速的從復(fù)雜字符串中獲取自己需要的數(shù)據(jù)。
二、基礎(chǔ)知識(shí)
1.簡(jiǎn)介
sscanf與scanf類似,都是用于輸入的,只是后者以鍵盤(pán)(stdin)為輸入源,前者以固定字符串為輸入源。
2.函數(shù)描述
int sscanf(const char buffer, const char format, [argument]...);
參數(shù):
buffer:需要解析的源字符串
format:窗體控件字符串,定義解析字符串的規(guī)則,可以是一個(gè)或多個(gè)
{%[*] [width] [{h | I | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號(hào)}
argument:可選變量,用來(lái)存儲(chǔ)按照f(shuō)ormat規(guī)則解析buffer的結(jié)果
注:
(1) 亦可用于格式中, (即 %d 和 %s) 加了星號(hào) () 表示跳過(guò)此數(shù)據(jù)。 (也就是不把此數(shù)據(jù)讀入?yún)?shù)中)
(2) {a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒(méi)有d。
(3) width表示讀取寬度。
(4) {h | l | I64 | L}:參數(shù)的size,通常h表示單字節(jié)size,I表示2字節(jié) size,L表示 4字節(jié)size(double例外),l64表示8字節(jié)size。
(5) type :這就很多了,就是%s,%d之類。
(6) 特別的:%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過(guò)濾掉, 不會(huì)向目標(biāo)參數(shù)中寫(xiě)入值,失敗返回0 ,否則返回格式化的參數(shù)個(gè)數(shù)
(7) 如果讀取的字符串,不是以空格來(lái)分隔的話,就可以使用%[]。
使用時(shí)候需要包含頭文件:#include
三、基礎(chǔ)知識(shí)
1.簡(jiǎn)單用法
#include
char *str = "123456 hello world";
int main(void)
{
int num = 0;
char str1[64] = { 0x00 };
char str2[64] = { 0x00 };
sscanf(str, "%d %s %", &num, str1, str2);
printf("num : %d\r\nstr1 : %s\r\nstr2 : %s\r\n", num, str1, str2);
return 0;
}
執(zhí)行結(jié)果如下:
2.取指定長(zhǎng)度字符串
#include
char *str = "123456";
int main(void)
{
char res[64] = { 0x00 };
sscanf(str, "%4s", res);
printf("res is: %s\r\n", res);
return 0;
}
執(zhí)行結(jié)果如下:
3. * 格式使用
(*)表示跳過(guò)此數(shù)據(jù)不讀入,也就是不把數(shù)據(jù)讀入?yún)?shù)中
#include
int main(void)
{
char *str = "123456hello world";
char res[64] = { 0x00 };
char res1[64] = { 0x00 };
sscanf(str, "%*d%s %s", res, res1);
printf("res is: %s\r\nres1 is: %s\r\n", res, res1);
return 0;
}
執(zhí)行結(jié)果如下:
4. %[]格式使用
(1) 獲取遇到指定字符為止的字符串
#include
int main(void)
{
char *str = "hello+world";
char res[64] = { 0x00 };
char res1[64] = { 0x00 };
sscanf(str, "%[^+]+%s", res, res1);
printf("res is: %s\r\nres1 is: %s\r\n", res, res1);
return 0;
}
執(zhí)行結(jié)果如下:
(2) 獲取遇到空格為止的字符串
#include
int main(void)
{
char *str = "hello world";
char res[64] = { 0x00 };
char res1[64] = { 0x00 };
sscanf(str, "%[^ ] %s", res, res1);
printf("res is: %s\r\nres1 is: %s\r\n", res, res1);
return 0;
}
執(zhí)行結(jié)果如下:
5.取指定字符集的字符串
#include
int main(void)
{
char *str = "hello123456HELLO";
char res[64] = { 0x00 };
sscanf(str, "%[a-z1-9]", res);
printf("res is: %s\r\n", res);
return 0;
}
執(zhí)行結(jié)果如下:
四、結(jié)語(yǔ)
本節(jié)完,實(shí)際操作過(guò)程中需要注意的地方有如下幾點(diǎn):
(1) %[^]只取到指定字符串,如繼續(xù)獲取之后字符串需要做處理,如上述第4小例。
此次執(zhí)行不能正常獲取到"world"而獲取了“+world",就是由于%[^]不取該字符,使用時(shí)候需要特別注意。
2.后記:
如您在使用過(guò)程中有任何問(wèn)題,請(qǐng)加QQ群進(jìn)一步交流,也可以github提Issue。
QQ交流群:906015840 (備注:物聯(lián)網(wǎng)項(xiàng)目交流)
github倉(cāng)庫(kù)地址:https://github.com/solitary-sand/c
一葉孤沙出品:一沙一世界,一葉一菩提