一文掌握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 輸出101.2 float類型
#include<stdio.h>
int main() {
float a = 1.1f;
scanf("%f", &a);
printf("%f", a);
}
//輸入浮點數(shù),輸出浮點數(shù),自動補齊小數(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é)束輸入,字符串未初始化輸出為隨機值燙燙燙
2.2.2 只讀取所有的大小寫字母
#include<stdio.h>
int main() {
char a[20];
scanf("%[a-zA-Z]", a);
printf("%s", a);
}
//讀取大小寫字母測試1 >正常讀?。ㄖ虚g沒有特殊字符)

全讀進去了
測試2 >中間有其他字符

遇到空格(其他字符),終止讀取,打印讀取到的abcF
下面做出改進,讓代碼可以打印空格
#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āng)讀取到的字符串里面分段出現(xiàn)不滿足的字符,
則丟棄字符只發(fā)生在不滿足丟棄條件的第一個字符之前
說人話就是
丟棄字符只發(fā)生一次
ABCL前面的abc確實被丟棄了,但是后面的沒有被丟棄,
當(dāng)丟棄發(fā)生到結(jié)束后,就不會再進行丟棄,只發(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)示例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
xxx_cast類型轉(zhuǎn)換的實現(xiàn)方法
下面小編就為大家?guī)硪黄獂xx_cast類型轉(zhuǎn)換的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
C++ throw關(guān)鍵字實現(xiàn)拋出異常和異常規(guī)范
本文主要介紹了C++ throw關(guān)鍵字實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
c++調(diào)用動態(tài)庫LNK2019和LNK1120無法解析的外部命令
本文主要介紹了c++調(diào)用動態(tài)庫LNK2019和LNK1120無法解析的外部命令, 出現(xiàn)這個錯誤一般都是函數(shù)只找到聲明但沒有實現(xiàn),或者是少了什么鏈接庫,下面就來解決一下2024-06-06
C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)鄰接表
這篇文章主要為大家詳細介紹了C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)鄰接表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04

