scanf的拓展用法——匹配特定字符


scanf的基本用法除了常規的輸入操作外還有一些特殊的用法,使用這些用法可以很方便的在輸入中讀取想要的數據

 

1、限制輸入數據的長度

這個應該算不上拓展用法,大多數讀者應該都曾經使用過,這里簡單提一下

輸入int類型

int main() { int a = 10; scanf("%3d", &a); printf("%d", a); return 0; }

scanf("%3d", &a)限制輸入數據的長度最多為3,如果數據長度大於3則只讀取前3位數據,如果輸入數據長度小於3,因為有回車符的存在也會結束輸入

運行結果:

 

輸入char類型

注意輸入char字符類型時不能限定長度(注意是字符,不是字符串),筆者目前能查到的信息給出的原因:語法規定,其實想一下也說得通,讀取一個字符,總不能scanf("%2c")把兩個字符塞到一個字符的空間里吧

 

輸入字符串類型

int main() { char ss[20]; scanf("%5s", ss); puts(ss); return 0; }

scanf("%5s", ss)表示讀取的字符串的最大長度為5,或者說,最多讀取5個字符

運行結果:

 

如果長度不足5,也會結束輸入,因為有換行符的存在

2、scanf匹配特定字符

scanf匹配特定字符的格式為:%[xxx],[ ]包圍起來的是需要讀取的字符集合

例如:

char ss[10]; scanf("%[abcd]", ss);

%[abcd]表示只讀取字符abcd遇到其它的字符就讀取結束(這句話是重點),如果abcd字符在字符串的中間部分那么就不能正常讀取字符

測試不同輸入的結果:

測試用例一:

\

(注意abcd的順序沒有要求,輸入bcda,badc等是可以正常讀入的)

 

測試用例二:

(只讀取了ab字符,遇到z時就結束輸入)

 

測試用例三:

(第一個字符是z結束輸入,字符串未初始化輸出為垃圾值) 

匹配特定字符還有一種更簡單的寫法,比如要匹配所有小寫字母,可以寫成%[a-z],匹配所有大字字符,可以寫成%[A-Z](需要注意的是左邊的字符要小於右邊的字符),利用這種寫法可以很方便的完成一些特定輸入的讀取

 

讀取所有的大小寫字母

char ss[20]; scanf("%[a-zA-Z]", ss); puts(ss);

上這種寫法有一個缺點,就是如果大小寫字母中間有其他字符的話就會直接結束輸入,運行示例如下

測試用例一:(中間沒有其他字符)

 

測試用例二:(中間有其他字符)

(這種情況就是之前說的了,中間出現了其他字符,就會結束輸入)

為了解決上面這種情況,對上面的代碼做一些修改,以解決空白符的情況,修改后代碼如下

char ss[20]; scanf("%[a-z A-Z]", ss); puts(ss);

其實就是在中間加一個空格,意思是空格也算匹配字符如果輸入中有空格符也會被正常讀取,運行效果如下

(需要注意的是,這條語句scanf("%[a-z A-Z]", ss)空格的位置不一定要放在中間,可以放在最前面scanf("%[ a-zA-Z]", ss),也可以放在最后面,scanf("%[a-zA-Z ]", ss))

如果輸入的字母中間除了空格還有制表符(兩者都算空白符),需要再加一個\t

scanf("%[a-z \tA-Z ]", ss);

運行效果:

如果想讀取數字可以寫成:

scanf("%[0-9]", ss);

 

3、不匹配某些字符(也可以叫過濾某些字符)

不匹配某些字符只需要在[ ]內的最前面加一個^就可以了,例如:

char ss[20]; scanf("%[^0-9]", ss); puts(ss);
scanf("%[^0-9]", ss)表示匹配除0-9之外的所有字符,遇到到0-9的數字就結束輸入,運行結果如下:

讀者到這里可以發現,scanf函數
可以用不匹配某些字符的寫法來完全替代gets函數了,代碼如下
char ss[20]; scanf("%[^\n]", ss); puts(ss);

scanf("%[^\n]", ss)的意思就是讀取除換行符之外的所有字符(是不是和gets的功能一模一樣了)

 

4、丟棄讀取到的字符

scanf() 允許把讀取到的數據直接丟棄,不往變量中存放,具體方法就是在 % 后面加一個*,例如:

scanf("%*[a-z]");
scanf("%*[a-z]")表示將讀取到的小寫字母丟棄


scanf("%*[0-9]");
scanf("%*[0-9]")表示將讀取到的數字丟棄

 

代碼示例:

char ss[20]; scanf("%*[a-z]"); scanf("%s", ss); puts(ss);

 

運行效果:

這種寫法有一個問題就是,在可讀入字符后面如果還有符合丟棄條件的字符也會讀取,而不會被丟棄,運行效果如下

(意思是這種丟棄只發生在不滿足丟棄條件的第一個字符之前(這句話有點繞),以上面的這個例子來說,在大寫字母ABCD之前的小寫字母abcd的確被丟棄了,但是大寫字母ABCD后面還有小寫字母abcd,此時丟棄就不再起作用了)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM