您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)sscanf函數(shù)和正則表達(dá)式是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
此文所有的實(shí)驗(yàn)都是基于下面的程序:
char str[10];
for (int i = 0; i < 10; i++) str[i] = '!';
執(zhí)行完后str的值為
str = "!!!!!!!!!!"
我們把str的每個(gè)字符都初始化為驚嘆號(hào),當(dāng)str的值發(fā)生變化時(shí),使用printf打印str的值,對(duì)比先前的驚嘆號(hào),這樣就可以方便的觀察str發(fā)生了怎樣的變化。下面我們做幾個(gè)小實(shí)驗(yàn),看看使用sscanf和正則表達(dá)式格式化輸入后,str有什么變化。
實(shí)驗(yàn)1:
sscanf(
"123456"
,
"%s"
,
str)
; ---------str的值為 "123456/0!!!"
這個(gè)實(shí)驗(yàn)很簡(jiǎn)單,把源字符串"123456"拷貝到str的前6個(gè)字符,并且把str的第7個(gè)字符設(shè)為null字符,也就是/0
實(shí)驗(yàn)2:
sscanf(
"123456"
,
"%3s"
,
str)
; ---------str的值為 "123/0!!!!!!"
看到?jīng)]有,正則表達(dá)式的百分號(hào)后面多了一個(gè)3,這告訴sscanf只拷貝3個(gè)字符給str,然后把第4個(gè)字符設(shè)為null字符。
實(shí)驗(yàn)3:
sscanf(
"aaaAAA"
,
"%[a-z]"
,
str)
; ---------str的值為 "aaa/0!!!!!!"
從這個(gè)實(shí)驗(yàn)開始我們會(huì)使用正則表達(dá)式,括號(hào)里面的a-z就是一個(gè)正則表達(dá)式,它可以表示從a到z的任意字符,
在
繼續(xù)討論之前,我們先來(lái)看看百分號(hào)表示什么意思,%表示選擇
,%后面的是條件,比如實(shí)驗(yàn)1的"%s",s是一個(gè)條件,表示任意字符,"%s"的意思是:只
要輸入的東西是一個(gè)字符,就把它拷貝給str。實(shí)驗(yàn)2的"%3s"又多了一個(gè)條件:只拷貝3個(gè)字符。實(shí)驗(yàn)3的“%[a-z]”的條件稍微嚴(yán)格一些,輸入的
東西不但是字符,還得是一個(gè)小寫字母的字符,所以實(shí)驗(yàn)3只拷貝了小寫字母"aaa"給str,別忘了加上null字符。
實(shí)驗(yàn)4:
sscanf(
"AAAaaaBBB"
,
"%[^a-z]"
,
str)
; ---------str的值為 "AAA/0!!!!!!"
對(duì)
于所有字符,只要不是小寫字母,都滿足"^a-z"正則表達(dá)式,符號(hào)^表示邏輯非。前3個(gè)字符都不是小寫字符,所以將其拷貝給str,但最后3個(gè)字符也不
是小寫字母,為什么不拷貝給str呢?這是因?yàn)楫?dāng)碰到不滿足條件的字符后,sscanf就會(huì)停止執(zhí)行,不再掃描之后的字符。
實(shí)驗(yàn)5:
sscanf(
"AAAaaaBBB"
,
"%[A-Z]%[a-z]"
,
str)
; ---------段錯(cuò)誤
這
個(gè)實(shí)驗(yàn)的本意是:先把大寫字母拷貝給str,然后把小寫字母拷貝給str,但很不幸,程序運(yùn)行的時(shí)候會(huì)發(fā)生段錯(cuò)誤,因?yàn)楫?dāng)sscanf掃描到字符a時(shí),違
反了條件"%[A-Z]",sscanf就停止執(zhí)行,不再掃描之后的字符,所以第二個(gè)條件也就沒(méi)有任何意義,這個(gè)實(shí)驗(yàn)說(shuō)明:不能使用%號(hào)兩次或兩次以上
實(shí)驗(yàn)6:
sscanf(
"AAAaaaBBB"
,
"%*[A-Z]%[a-z]"
,
str)
; ---------str的值為 "aaa/0!!!!!!"
這
個(gè)實(shí)驗(yàn)出現(xiàn)了一個(gè)新的符號(hào):%*,與%相反,%*表示過(guò)濾
滿足條件的字符,在這個(gè)實(shí)驗(yàn)中,%*[A-Z]過(guò)濾了所有大寫字母,然后再使用%[a-z]把之
后的小寫字母拷貝給str。如果只有%*,沒(méi)有%的話,sscanf不會(huì)拷貝任何字符到str,這時(shí)sscanf的作用僅僅是過(guò)濾字符串。
實(shí)驗(yàn)7:
sscanf(
"AAAaaaBBB"
,
"%[a-z]"
,
str)
; ---------str的值為 "!!!!!!!!!!"
做完前面幾個(gè)實(shí)驗(yàn)后,我們都知道sscanf拷貝完成后,還會(huì)在str的后面加上一個(gè)null字符,但如果沒(méi)有一個(gè)字符滿足條件,sscanf不會(huì)在str的后面加null字符,str的值依然是10個(gè)驚嘆號(hào)。這個(gè)實(shí)驗(yàn)也說(shuō)明了,如果不使用%*過(guò)濾掉前面不需要的字符,你永遠(yuǎn)別想取得中間的字符。
實(shí)驗(yàn)8:
sscanf(
"AAAaaaBC="
,
"%*[A-Z]%*[a-z]%[^a-z=]"
,
str)
; ---------str的值為 "BC/0!!!!!!!"
這是一個(gè)綜合實(shí)驗(yàn),但這個(gè)實(shí)驗(yàn)的目的不是幫我們復(fù)習(xí)前面所學(xué)的知識(shí),而是展示兩個(gè)值得注意的地方:
注意1:%只能使用一次,但%*可以使用多次,比如在這個(gè)實(shí)驗(yàn)里面,先用%*[A-Z]過(guò)濾大寫字母,然后用%*[a-z]過(guò)濾小寫字母。
注意2:^后面可以帶多個(gè)條件,且這些條件都受^的作用,比如^a-z=表示^a-z且^=(既不是小寫字母,也不是等于號(hào))。
實(shí)驗(yàn)9:
int k;
sscanf(
"AAA123BBB456"
,
"%*[^0-9]%i"
,
&k)
; ---------k的值為123
首先,%*[^0-9]過(guò)濾前面非數(shù)字的字符,然后用%i把數(shù)字字符轉(zhuǎn)換成int型的整數(shù),拷貝到變量k,注意參數(shù)必須使用k的地址。
以上就是sscanf函數(shù)和正則表達(dá)式是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。