一文掌握scanf的用法實例小結(jié)
scanf的用法
scanf的基本用法除了常規(guī)的輸入操作外還有一些特殊的用法,使用這些用法可以很方便的在輸入中讀取想要的數(shù)據(jù)
1.正常用法
1.1 int類型
#include<stdio.h> int main() { int a = 0; scanf("%d", &a); printf("%d", a); } //輸入10 輸出10
1.2 float類型
#include<stdio.h> int main() { float a = 1.1f; scanf("%f", &a); printf("%f", a); } //輸入浮點數(shù),輸出浮點數(shù),自動補(bǔ)齊小數(shù)點后6位 //double同理
1.3 char類型
#include<stdio.h> int main() { char a = 'm'; scanf("%c", &a); printf("%c", a); } //輸入字符,輸出字符,只需要控制打印的格式即可
1.4 字符串類型
#include<stdio.h> int main() { char a[] = "abcdefg"; scanf("%s", a); printf("%s", a); } //輸入字符數(shù)組,輸出字符數(shù)組,但是輸入的字符大小不能超過數(shù)組大小
2.拓展用法
2.1 限制讀取的長度
int 類型
#include<stdio.h> int main() { int a = 10; scanf("%3d", &a); printf("%d", a); } //scanf("%3d", &a)限制輸入數(shù)據(jù)的長度最多為3, //如果數(shù)據(jù)長度大于3則只讀取前3位數(shù)據(jù), //如果輸入數(shù)據(jù)長度小于3,因為有回車符的存在也會結(jié)束輸入
char類型不能限制,因為只有一個,但是數(shù)組字符串可以
#include<stdio.h> int main() { char a[10] = "ada"; scanf("%5s", a); printf("%s", a); } //同上所說,最多4位,不足4位也會因為換行符結(jié)束
2.2 scanf匹配特定的字符
scanf匹配特定字符的格式為:%[xxx],[ ]包圍起來的是需要讀取的字符集合
2.2.1 只讀取想要的特定字符
char a[10]; scanf("%[abcd]", a);
%[abcd]表示只讀取字符abcd,遇到其它的字符就讀取結(jié)束,如果abcd字符在字符串的中間部分那么就不能正常讀取字符
測試1
abcd沒有順序要求,這四個字符什么順序均可以被錄入
測試2
只讀取到ab,遇到f結(jié)束
測試3
第一個字符是n結(jié)束輸入,字符串未初始化輸出為隨機(jī)值燙燙燙
2.2.2 只讀取所有的大小寫字母
#include<stdio.h> int main() { char a[20]; scanf("%[a-zA-Z]", a); printf("%s", a); } //讀取大小寫字母
測試1 >正常讀?。ㄖ虚g沒有特殊字符)
全讀進(jìn)去了
測試2 >中間有其他字符
遇到空格(其他字符),終止讀取,打印讀取到的abcF
下面做出改進(jìn),讓代碼可以打印空格
#include<stdio.h> int main() { char a[20]; scanf("%[a-z A-Z]", a); printf("%s", a); //其實就是在中間加一個空格,意思是空格也算匹配字符如果輸入中有空格符也會被正常讀取 }
這條語句scanf("%[a-z A-Z]", a)空格的位置不一定要放在中間,
可以放在最前面scanf("%[ a-zA-Z]", a),
也可以放在最后面,scanf("%[a-zA-Z ]", a)
輸入的字母中間除了空格還有制表符(兩者都算空白符),需要再加一個\t
測試3>有制表符tab
#include<stdio.h> int main() { char a[20]="abcd"; scanf("%[a-z \tA-Z ]", a); printf("%s", a); }
如果輸入的字母中間除了空格還有制表符(兩者都算空白符),
需要再加一個\t
2.2.3 只讀取數(shù)字[0-9]
#include<stdio.h> int main() { char a[20]="abcd"; scanf("%[0-9]", a); printf("%s", a); }
測試1> 正常讀取數(shù)字
測試2> 遇到其他符號終止
2.3 不匹配某些字符
不匹配某些字符只需要在[ ]內(nèi)的最前面加一個^就可以了,例如:
#include<stdio.h> int main() { char a[20]="abcd"; scanf("%[^0-9]", a); printf("%s", a); }
scanf函數(shù)可以用不匹配某些字符的寫法來完全替代gets函數(shù)
#include<stdio.h> int main() { char a[20]="abcd"; scanf("%[^\n]", a); //讀取除換行符之外的所有字符(和gets的功能一模一樣) printf("%s", a); }
2.4 丟棄某些字符
scanf() 允許把讀取到的數(shù)據(jù)直接丟棄,不往變量中存放,
具體方法就是在 % 后面加一個* 例如:
#include<stdio.h> int main() { char a[20]="\0"; scanf("%*[a-z]"); scanf("%s", a); printf("%s", a); }
這種寫法有一個問題就是,在可讀入字符后面如果還有符合丟棄條件的字符也會讀取,而不會被丟棄,例如:
上面圖片表達(dá)的意思是,當(dāng)讀取到的字符串里面分段出現(xiàn)不滿足的字符,
則丟棄字符只發(fā)生在不滿足丟棄條件的第一個字符之前
說人話就是
丟棄字符只發(fā)生一次
ABCL前面的abc確實被丟棄了,但是后面的沒有被丟棄,
當(dāng)丟棄發(fā)生到結(jié)束后,就不會再進(jìn)行丟棄,只發(fā)生一次,后面遇到要丟棄的字符也不會起到丟棄作用
到此這篇關(guān)于一文掌握scanf的用法的文章就介紹到這了,更多相關(guān)c++ scanf用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)學(xué)生管理系統(tǒng)示例解析
這篇文章主要介紹了C++實現(xiàn)學(xué)生管理系統(tǒng)示例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08xxx_cast類型轉(zhuǎn)換的實現(xiàn)方法
下面小編就為大家?guī)硪黄獂xx_cast類型轉(zhuǎn)換的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12C++ throw關(guān)鍵字實現(xiàn)拋出異常和異常規(guī)范
本文主要介紹了C++ throw關(guān)鍵字實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08c++調(diào)用動態(tài)庫LNK2019和LNK1120無法解析的外部命令
本文主要介紹了c++調(diào)用動態(tài)庫LNK2019和LNK1120無法解析的外部命令, 出現(xiàn)這個錯誤一般都是函數(shù)只找到聲明但沒有實現(xiàn),或者是少了什么鏈接庫,下面就來解決一下2024-06-06C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)鄰接表
這篇文章主要為大家詳細(xì)介紹了C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)鄰接表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04