微信網(wǎng)站開發(fā)語(yǔ)言百度游戲app下載
前言:
? ? ? ? ? ? ? ? 當(dāng)有了變量,我們需要給變量輸入值就可以使用scanf函數(shù),如果需要將變量的值輸出在屏幕上的時(shí)候可以使用printf函數(shù),如:
#include <stdio.h>
int main()
{int score = 0;printf("請(qǐng)輸?成績(jī):");scanf("%d", &score);printf("成績(jī)是:%d\n", score);return 0;
}
運(yùn)行截圖:
1.基本用法
? ? ? ? scanf()函數(shù)用于從標(biāo)準(zhǔn)輸入(通常是鍵盤)讀取用戶的輸入的數(shù)據(jù)。當(dāng)程序運(yùn)行到這個(gè)語(yǔ)句時(shí),會(huì)停下來(lái),等待用戶從鍵盤輸入。用戶輸入數(shù)據(jù)后,按下回車鍵,scanf()就會(huì)處理用戶的輸入,將其存入變量。它的原型定義在頭文件stdio.h 。
? ?scanf()的語(yǔ)法跟pritnf()類似。
scanf("%d", &i);
????????它的第?個(gè)參數(shù)是?個(gè)格式字符串,??會(huì)放置占位符(與 printf() 的占位符基本?致),告訴編譯器如何解讀用戶的輸入,需要提取的數(shù)據(jù)是什么類型。這是因?yàn)镃語(yǔ)言的數(shù)據(jù)都是有類型的, scanf() 必須提前知道用戶輸入的數(shù)據(jù)類型,才能處理數(shù)據(jù)。
????????它的其余參數(shù)就是存放用戶輸入的變量,格式字符串里面有多少個(gè)占位符,就有多少個(gè)變量。
????????上面示例中, scanf() 的第?個(gè)參數(shù) %d ,表示用戶輸入的應(yīng)該是?個(gè)整數(shù)。 %d 就是?個(gè)占位符, % 是占位符的標(biāo)志, d 表示整數(shù)。第?個(gè)參數(shù) &i 表示,將用戶從鍵盤輸?的整數(shù)存入變量
i 。
注意:變量前面必須加上 & 運(yùn)算符(指針變量除外),因?yàn)?span style="color:#79c6cd;"> scanf() 傳遞的不是值,?是地址,
即將變量 i 的地址指向用戶輸入的值。
如果這里的變量是指針變量(比如字符串變量)或數(shù)組,那就不用加 & 運(yùn)算符。?
?下面是一次將鍵盤輸入多個(gè)變量的例子:
scanf("%d %d %f %f", &i, &j, &x, &y);? ? ?
上面示例中,格式字符串 %d%d%f%f ,表示用戶輸?的前兩個(gè)是整數(shù),后兩個(gè)是浮點(diǎn)數(shù),?如 1 -20 3.4 -4.0e3 。這四個(gè)值依次放? i 、 j 、 x 、 y 四個(gè)變量。
????????scanf() 處理數(shù)值占位符時(shí),會(huì)?動(dòng)過濾空?字符,包括空格、制表符、換?符等。
所以,用戶輸入的數(shù)據(jù)之間,有?個(gè)或多個(gè)空格不影響 scanf() 解讀數(shù)據(jù)。另外,?戶使?回?
鍵,將輸入分成幾行,也不影響解讀。?
1
-20
3.4
-4.0e3//-4.0*10^3
上面示例中,用戶分成四行輸?,得到的結(jié)果與一行輸?是完全?樣的。
????????每次按下回車鍵以后,scanf() 就會(huì)開始解讀,如果第一行匹配第?個(gè)占位符,那么下次按下回車鍵時(shí),就會(huì)從第?個(gè)占位符開始解讀。
????????scanf() 處理用戶輸入的原理是,用戶的輸入先放入緩存,等到按下回車鍵后,按照占位符對(duì)緩存進(jìn)行解讀。
????????解讀用戶輸入時(shí),會(huì)從上?次解讀遺留的第?個(gè)字符開始,直到讀完緩存,或者遇到第?個(gè)不符合條件的字符為止。(小數(shù)在內(nèi)存中有時(shí)無(wú)法精確保存)
// ??輸? " -13.45e12# 0"
#include <stdio.h>
int main()
{int x;float y;scanf("%d%f", &x, &y);printf("%d %f", x, y);return 0;
}
?運(yùn)行截圖:
分析:
上??例中, scanf() 讀取用戶輸入時(shí), %d 占位符會(huì)忽略起首的空格,從 - 處開始獲取數(shù)據(jù),讀
取到 -13 停下來(lái),因?yàn)楹?的 . 不屬于整數(shù)的有效字符。這就是說(shuō),占位符 %d 會(huì)讀到 -13 。
第?次調(diào)用 scanf() 時(shí),就會(huì)從上一次停止解讀的地方,繼續(xù)往下讀取。這?次讀取的首字符
是 . ,由于對(duì)應(yīng)的占位符是 %f ,會(huì)讀取到 .45e12 ,這是采用科學(xué)計(jì)數(shù)法的浮點(diǎn)數(shù)格式。后面的
# 不屬于浮點(diǎn)數(shù)的有效字符,所以會(huì)停在這里, # 0留在緩存區(qū)。
2.scanf返回值
????????scanf() 的返回值是?個(gè)整數(shù),表示成功讀取的變量個(gè)數(shù)。
如果沒有讀取任何項(xiàng),或者匹配失敗,則返回 0 。
如果在成功讀取任何數(shù)據(jù)之前,發(fā)生了讀取錯(cuò)誤或者遇到讀取到?件結(jié)尾,則返回常量EOF。
//一組輸入
#include <stdio.h>
int main()
{int a = 0;int b = 0;float f = 0.0f;int r = scanf("%d %d %f", &a, &b, &f);//返回讀取的個(gè)數(shù)printf("a=%d b=%d f=%f\n", a, b, f);printf("r = %d\n", r);return 0;
}
輸入輸出測(cè)試:
?如果輸入2個(gè)輸后,按ctrl+z后按回車,提前結(jié)束輸入:
在VS環(huán)境中按3次 ctrl+z ,才結(jié)束了輸?,我們可以看到r是2,表?正確讀取了2個(gè)數(shù)值。
如果?個(gè)數(shù)字都不輸?,直接按3次 ctrl+z ,輸出的r是-1,也就是EOF
3.多組輸入?
//多組輸入
#include<stdio.h>
int main()
{int a = 0, b = 0;//while (scanf("%d %d", &a, &b) == 2)while(scanf("%d %d", &a, &b)!=EOF){int c = a + b;printf("%d\n", c);}return 0;
}
運(yùn)行示例:
從運(yùn)行示例圖可以看出,由于換行符\n,光標(biāo)移動(dòng)到下一行,等待我們的輸入,這就是多組輸入 。
4.占位符
????????scanf() 常用的占位符如下,與 printf() 的占位符基本?致。
? %c :字符。
? %d :整數(shù)。
? %f : float 類型浮點(diǎn)數(shù)。
? %lf : double 類型浮點(diǎn)數(shù)。
? %Lf : long double 類型浮點(diǎn)數(shù)。
? %s :字符串,從非空字符開始讀取,遇到空白字符停止。
? %[] :在方括號(hào)中指定?組匹配的字符(數(shù)字字符,比如 %[0-9] ),遇到不在集合之中的字符,匹配將會(huì)停止。
上面所有占位符中,除了 %c 以外,都會(huì)自動(dòng)忽略起首的空白字符。 %c 不忽略空白字符,總是返回當(dāng)前第?個(gè)字符,無(wú)論該字符是否為空格。
如果要強(qiáng)制跳過字符前的空白字符,可以寫成 scanf(" %c", &ch) ,即 %c 前加上?個(gè)空格,表示跳過零個(gè)或多個(gè)空白字符。
#include<stdio.h>
int main()
{char ch = '0';scanf("%c", &ch);//輸入空格空格1printf("%cxxx", ch);//輸出空格空格1xxxreturn 0;
}
下面要特別說(shuō)?下占位符 %s ,它其實(shí)不能簡(jiǎn)單地等同于字符串。它的規(guī)則是,從當(dāng)前第?個(gè)非空白字符開始讀起,直到遇到空?字符(即空格、換?符、制表符等)為?。
因?yàn)?strong> %s 不會(huì)包含空白字符,所以無(wú)法用來(lái)讀取多個(gè)單詞,除非多個(gè) %s ?起使用。這也意味著,
scanf() 不適合讀取可能包含空格的字符串,比如書名或歌曲名。另外, scanf() 遇到 %s 占位
符,會(huì)在字符串變量末尾存儲(chǔ)?個(gè)空字符 \0 。
scanf() 將字符串讀?字符數(shù)組時(shí),不會(huì)檢測(cè)字符串是否超過了數(shù)組長(zhǎng)度。所以,儲(chǔ)存字符串時(shí),
很可能會(huì)超過數(shù)組的邊界,導(dǎo)致預(yù)想不到的結(jié)果。為了防?這種情況,使用?%s 占位符時(shí),應(yīng)該指定讀?字符串的最長(zhǎng)長(zhǎng)度,即寫成 %[m]s?(與printf輸出部分字符串類似:https://blog.csdn.net/wait___wait/article/details/135287228),其中的 [m] 是?個(gè)整數(shù),表示讀取字符串的最大長(zhǎng)度,后面的字符將被丟棄。?
5.賦值忽略符
????????有時(shí),用戶的輸入可能不符合預(yù)定的格式。
#include <stdio.h>
int main()
{int year = 0;int month = 0;int day = 0;scanf("%d-%d-%d", &year, &month, &day);printf("%d %d %d\n", year, month, day);return 0;
}
上述示例中,如果用戶輸入?2020-01-01 ,就會(huì)正確解讀出年、?、?。問題是用戶可能輸?其他
格式,?如 2020/01/01 ,這種情況下, scanf() 解析數(shù)據(jù)就會(huì)失敗。
為了避免這種情況, scanf() 提供了?個(gè)賦值忽略符?。
只要把 * 加在任何占位符的百分號(hào)后面,該占位符就不會(huì)返回值,解析后將被丟棄。
#include <stdio.h>
int main()
{int year = 0;int month = 0;int day = 0;scanf("%d%*c%d%*c%d", &year, &month, &day);return 0;
}
上面示例中, %*c 就是在占位符的百分號(hào)后面,加入了賦值忽略符 * ,表示這個(gè)占位符沒有對(duì)應(yīng)的變量,解讀后不必返回。
歡迎斧正!!!
?