scanf的拓展用法——匹配特定字符
scanf的基本用法除了常規(guī)的輸入操作外還有一些特殊的用法,使用這些用法可以很方便的在輸入中讀取想要的數(shù)據(jù)
?
1、限制輸入數(shù)據(jù)的長度
這個(gè)應(yīng)該算不上拓展用法,大多數(shù)讀者應(yīng)該都曾經(jīng)使用過,這里簡單提一下
輸入int類型
int main() {int a = 10;scanf("%3d", &a);printf("%d", a);return 0; }scanf("%3d", &a)限制輸入數(shù)據(jù)的長度最多為3,如果數(shù)據(jù)長度大于3則只讀取前3位數(shù)據(jù),如果輸入數(shù)據(jù)長度小于3,因?yàn)橛谢剀嚪拇嬖谝矔?huì)結(jié)束輸入
運(yùn)行結(jié)果:
?
輸入char類型
注意輸入char字符類型時(shí)不能限定長度(注意是字符,不是字符串),筆者目前能查到的信息給出的原因:語法規(guī)定,其實(shí)想一下也說得通,讀取一個(gè)字符,總不能scanf("%2c")把兩個(gè)字符塞到一個(gè)字符的空間里吧
?
輸入字符串類型
int main() {char ss[20];scanf("%5s", ss);puts(ss);return 0; }scanf("%5s", ss)表示讀取的字符串的最大長度為5,或者說,最多讀取5個(gè)字符
運(yùn)行結(jié)果:
?
如果長度不足5,也會(huì)結(jié)束輸入,因?yàn)橛袚Q行符的存在
2、scanf匹配特定字符
scanf匹配特定字符的格式為:%[xxx],[ ]包圍起來的是需要讀取的字符集合
例如:
char ss[10]; scanf("%[abcd]", ss);%[abcd]表示只讀取字符abcd,遇到其它的字符就讀取結(jié)束(這句話是重點(diǎn)),如果abcd字符在字符串的中間部分那么就不能正常讀取字符
測試不同輸入的結(jié)果:
測試用例一:
\
(注意abcd的順序沒有要求,輸入bcda,badc等是可以正常讀入的)
?
測試用例二:
(只讀取了ab字符,遇到z時(shí)就結(jié)束輸入)
?
測試用例三:
(第一個(gè)字符是z結(jié)束輸入,字符串未初始化輸出為垃圾值)?
匹配特定字符還有一種更簡單的寫法,比如要匹配所有小寫字母,可以寫成%[a-z],匹配所有大字字符,可以寫成%[A-Z](需要注意的是左邊的字符要小于右邊的字符),利用這種寫法可以很方便的完成一些特定輸入的讀取
?
讀取所有的大小寫字母
char ss[20];scanf("%[a-zA-Z]", ss); puts(ss);上這種寫法有一個(gè)缺點(diǎn),就是如果大小寫字母中間有其他字符的話就會(huì)直接結(jié)束輸入,運(yùn)行示例如下
測試用例一:(中間沒有其他字符)
?
測試用例二:(中間有其他字符)
(這種情況就是之前說的了,中間出現(xiàn)了其他字符,就會(huì)結(jié)束輸入)
為了解決上面這種情況,對(duì)上面的代碼做一些修改,以解決空白符的情況,修改后代碼如下
char ss[20];scanf("%[a-z A-Z]", ss); puts(ss);其實(shí)就是在中間加一個(gè)空格,意思是空格也算匹配字符如果輸入中有空格符也會(huì)被正常讀取,運(yùn)行效果如下
(需要注意的是,這條語句scanf("%[a-z A-Z]", ss)空格的位置不一定要放在中間,可以放在最前面scanf("%[ a-zA-Z]", ss),也可以放在最后面,scanf("%[a-zA-Z ]", ss))
如果輸入的字母中間除了空格還有制表符(兩者都算空白符),需要再加一個(gè)\t
scanf("%[a-z \tA-Z ]", ss);運(yùn)行效果:
如果想讀取數(shù)字可以寫成:
scanf("%[0-9]", ss);?
3、不匹配某些字符(也可以叫過濾某些字符)
不匹配某些字符只需要在[ ]內(nèi)的最前面加一個(gè)^就可以了,例如:
char ss[20]; scanf("%[^0-9]", ss);puts(ss); scanf("%[^0-9]", ss)表示匹配除0-9之外的所有字符,遇到到0-9的數(shù)字就結(jié)束輸入,運(yùn)行結(jié)果如下:讀者到這里可以發(fā)現(xiàn),scanf函數(shù)可以用不匹配某些字符的寫法來完全替代gets函數(shù)了,代碼如下 char ss[20];scanf("%[^\n]", ss); puts(ss);
scanf("%[^\n]", ss)的意思就是讀取除換行符之外的所有字符(是不是和gets的功能一模一樣了)
?
4、丟棄讀取到的字符
scanf() 允許把讀取到的數(shù)據(jù)直接丟棄,不往變量中存放,具體方法就是在 % 后面加一個(gè)*,例如:
scanf("%*[a-z]"); scanf("%*[a-z]")表示將讀取到的小寫字母丟棄scanf("%*[0-9]"); scanf("%*[0-9]")表示將讀取到的數(shù)字丟棄
?
代碼示例:
char ss[20];scanf("%*[a-z]"); scanf("%s", ss); puts(ss);?
運(yùn)行效果:
這種寫法有一個(gè)問題就是,在可讀入字符后面如果還有符合丟棄條件的字符也會(huì)讀取,而不會(huì)被丟棄,運(yùn)行效果如下
(意思是這種丟棄只發(fā)生在不滿足丟棄條件的第一個(gè)字符之前(這句話有點(diǎn)繞),以上面的這個(gè)例子來說,在大寫字母ABCD之前的小寫字母abcd的確被丟棄了,但是大寫字母ABCD后面還有小寫字母abcd,此時(shí)丟棄就不再起作用了)
?
轉(zhuǎn)載于:https://www.cnblogs.com/lanhaicode/p/10585418.html
總結(jié)
以上是生活随笔為你收集整理的scanf的拓展用法——匹配特定字符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue.js购物车
- 下一篇: 2019.3.23 python的uni