高價(jià)做單網(wǎng)站網(wǎng)站seo排名優(yōu)化工具在線
目錄
一、printf()輸出函數(shù)介紹
二、scanf讀取標(biāo)準(zhǔn)輸入
(一)scanf函數(shù)的原理
(二)多種數(shù)據(jù)類型混合輸入
三、練習(xí)題
今天我們學(xué)習(xí)printf和scanf讀取標(biāo)準(zhǔn)輸入。下面我們開(kāi)始正式的學(xué)習(xí)吧。
C語(yǔ)言中有很多內(nèi)置函數(shù),今天我們主要了解printf()函數(shù)和scanf()函數(shù),C語(yǔ)言常用函數(shù)我也列在下圖了,大家參考學(xué)習(xí):
一、printf()輸出函數(shù)介紹
printf函數(shù)可以輸出各種類型的數(shù)據(jù),包括整型、浮點(diǎn)型、字符型、字符串型等,實(shí)際原理是printf函數(shù)將這些類型的數(shù)據(jù)格式化為字符串后,放入標(biāo)準(zhǔn)輸出緩沖區(qū),然后將結(jié)果顯示到屏幕上。
語(yǔ)法如下:
#include <stdio.h>
int printf(const char*format,...)
printf函數(shù)根據(jù)format給出的格式打印輸出到stdout(標(biāo)準(zhǔn)輸出)和其他參數(shù)中。
字符串格式(format) 由兩部分組成:顯示到屏幕上的字符和定義printf函數(shù)顯示的其他參數(shù)。我們可以指定一個(gè)包含文本在內(nèi)的format字符串,也可以是映射到printf的其他參數(shù)和“特殊”字符,如下列代碼所示:
int count= 27;
printf("Hello %s,I've missed you %d times today\n ","HHY",count);
代碼的輸出如下:
Hello HHY,?I've missed you 27 times today
其中,%s表示在該位置插入首個(gè)參數(shù)?(一個(gè)字符串),%d表示第二個(gè)參數(shù)(一個(gè)整數(shù))應(yīng)該放在哪里。不同的%codes白哦是不同的變量類型,也可以限制變量的長(zhǎng)度。printf函數(shù)的具體代碼格式如下表所示:
代碼 | 格式 |
%c | 字符 |
%d | 帶符號(hào)整數(shù) |
%f | 浮點(diǎn)數(shù) |
%s | 一串字符 |
%u | 無(wú)符號(hào)整數(shù) |
%x | 無(wú)符號(hào)十六進(jìn)制數(shù),用小寫(xiě)字母 |
%X | 無(wú)符號(hào)十六進(jìn)制數(shù),用大寫(xiě)字母 |
%p | 一個(gè)指針 |
%% | 一個(gè)'%'符號(hào) |
位于%和格式化命令之間的一個(gè)整數(shù)被稱為最小字段寬度說(shuō)明符,通常會(huì)加上空格來(lái)控制格式。
- 用%f精度修飾符指定想要的小數(shù)位數(shù)。例如,%5.2f?會(huì)至少顯示5位數(shù)字并帶有?2位小數(shù)的浮點(diǎn)數(shù)。
- 用%s精度修飾符簡(jiǎn)單地表示一個(gè)最大的長(zhǎng)度,以補(bǔ)充句點(diǎn)前的最小字段長(zhǎng)度。
printf?函數(shù)的所有輸出都是右對(duì)齊的,除非在%符號(hào)后放置了負(fù)號(hào),例如,%-3.4f?會(huì)顯示3位字符、4位小數(shù)位的浮點(diǎn)數(shù)并且左對(duì)齊。
下面來(lái)看一個(gè)例子,如下面例子所示。
【例】printf?函數(shù)輸出對(duì)齊:
#include <stdio.h>int main() {int i = 42;float f = 13.14;printf("Student number = %3d grade = %3.4f\n",i,f);printf("Student number = %-3d grade = %3.4f\n",i,f);printf("%12s\n","qualified");return 0;
}
執(zhí)行結(jié)果如下圖所示,可以看到整型數(shù) 42 在不加負(fù)號(hào)時(shí)靠右對(duì)齊,加負(fù)號(hào)時(shí)靠左對(duì)齊,?%12s?代表字符串共占用12個(gè)字符的位置。因?yàn)?printf?函數(shù)默認(rèn)靠右對(duì)齊,所以"qualified"字符串相對(duì)于左邊的起始位置有 5個(gè)空格的距離。掌握這些內(nèi)容后,在做編程作業(yè)時(shí),就會(huì)很容易掌握打印格式的控制。
二、scanf讀取標(biāo)準(zhǔn)輸入
?如下圖所示,程序員可以給程序輸入數(shù)據(jù),程序處理后會(huì)返回一個(gè)輸出,C語(yǔ)言通過(guò)函數(shù)庫(kù)讀取標(biāo)準(zhǔn)輸入,然后通過(guò)對(duì)應(yīng)函數(shù)處理將結(jié)果打印到屏幕上。前面我們學(xué)習(xí)了printf函數(shù),理解了通過(guò)printf函數(shù)可以將結(jié)果輸出到屏幕上,下面詳細(xì)講解標(biāo)準(zhǔn)輸入函數(shù)scanf 。
(一)scanf函數(shù)的原理
C語(yǔ)言未提供輸入/輸出-關(guān)鍵字,其輸入和輸出是通過(guò)標(biāo)準(zhǔn)函數(shù)庫(kù)來(lái)實(shí)現(xiàn)的。C語(yǔ)言通過(guò)scanf函數(shù)讀取鍵盤(pán)輸入,鍵盤(pán)輸入又被稱為標(biāo)準(zhǔn)輸入,當(dāng)scanf函數(shù)讀取標(biāo)準(zhǔn)輸入時(shí),如果還沒(méi)有輸入任何內(nèi)容,那么scanf函數(shù)會(huì)被卡住(專業(yè)用語(yǔ)為阻塞)?.下面來(lái)看一個(gè)例子。
【例】:
#include <stdio.h>int main() {int x = 10;char c;scanf("%d",&x);//注意一定要取地址‘&’printf("x = %d\n",x);//fflush(stdin);//清空標(biāo)準(zhǔn)輸入緩沖區(qū)scanf("%c",&c);printf("c = %c\n",c);return 0;
}
執(zhí)行時(shí)輸入23,然后回車,顯示運(yùn)行結(jié)果如下圖所示。為什么第二個(gè)scanf?的數(shù)不會(huì)被阻塞呢?其實(shí)是因?yàn)榈诙€(gè)?scanf函數(shù)讀取了緩沖區(qū)中的'\n',即scanf("%c",&c)實(shí)現(xiàn)了讀取,打印其實(shí)輸出了換行,所以不會(huì)阻塞。
?
但是如果我們將上面例子中注釋的fflush(stdin)打開(kāi),就會(huì)發(fā)現(xiàn)第二個(gè)?scanf("%c",?&c)會(huì)阻塞,這是什么原因呢?下面介紹緩沖區(qū)原理:
行緩沖:在這種情況下,當(dāng)在輸人和輸出中遇到換行符時(shí),將執(zhí)行真正的 I/O 處理操作。這時(shí),我們輸入的字符先存放到緩沖區(qū)中,等按下回車鍵換行時(shí)才進(jìn)行實(shí)際的 I/O 操作,典型代表是標(biāo)準(zhǔn)輸人緩沖區(qū)?(stdin)?和標(biāo)準(zhǔn)輸出緩沖區(qū)?(stdout)?,?printf?使用的是stdout。
如上面的例子所示,我們向標(biāo)準(zhǔn)輸人緩沖區(qū)中放人的字符為23\n,?輸入'\n'?(回車)?后,?scanf?函數(shù)才開(kāi)始匹配,scanf?麗數(shù)中的%d?匹配整型數(shù)23,然后放入變量 x?中,接著進(jìn)行打印輸出,這時(shí) '\n' 仍然在標(biāo)準(zhǔn)輸人緩沖區(qū)(stdin)?內(nèi),如果第二個(gè)scanf?的數(shù)為?scanf("%d'",?&x),那么依然會(huì)發(fā)生阻塞,因?yàn)?scanf?函數(shù)在讀取整型數(shù)、浮點(diǎn)數(shù)、字符串(后面介紹數(shù)組時(shí)講解字符串)時(shí),會(huì)忽略\n'?(回車符)、空格符等字符?(忽略是指?scanf?的數(shù)執(zhí)行時(shí)會(huì)首先刪除這些字符,然后再阻塞)。scanf?函數(shù)匹配一個(gè)字符時(shí),會(huì)在緩沖區(qū)刪除對(duì)應(yīng)的字符。因?yàn)樵趫?zhí)行?scanf("%c",?&c)語(yǔ)句時(shí),不會(huì)忽略任何字符,所以?scanf("%c",?&c)讀取了還在緩沖區(qū)中殘留的'\n'。
(二)多種數(shù)據(jù)類型混合輸入
當(dāng)我們讓?scanf?函數(shù)一次讀取多種類型的數(shù)據(jù)時(shí),對(duì)于字符型數(shù)據(jù)要格外小心,因?yàn)楫?dāng)一行數(shù)據(jù)中存在字符型數(shù)據(jù)讀取時(shí),讀取的字符并不會(huì)忽略空格和'\n'(回車符),所以使用方法如下例所示,編寫(xiě)代碼時(shí),我們需要在%d與%c?之間加入一個(gè)空格,輸人格式和輸出效果如下圖所示,scanf?函數(shù)匹配成功了4個(gè)成員,所以返回值為4,?我們可以通過(guò)返回值來(lái)判斷?scanf?函數(shù)匹配成功了幾個(gè)成員,中間任何有一個(gè)成員匹配出錯(cuò),后面的成員都會(huì)匹配出錯(cuò)。
【例】一次讀入多種類型的數(shù)據(jù)
#include <stdio.h>int main() {int x,result;char c;float f;result = scanf("%d %c%f",&x,&c,&f);//要在%c之前加一個(gè)空格printf("x = %d,c = %c,f = %f\n",x,c,f);return 0;
}
運(yùn)行結(jié)果如下:
三、練習(xí)題
下一期:
【C語(yǔ)言】C語(yǔ)言期末突擊/考研--整型進(jìn)制轉(zhuǎn)換