scanf函數(shù)稱為格式輸入函數(shù),即按照格式字符串的格式,從鍵盤上把數(shù)據(jù)輸入到指定的變量之中。scanf函數(shù)的調(diào)用的一般形式為:
scanf("格式控制字符串",輸入項地址列表);
其中,格式控制字符串的作用與printf函數(shù)相同,但不能顯示非格式字符串,也就是不能顯示提示字符串。地址表項中的地址給出各變量的地址,地址是由地址運(yùn)算符“&”后跟變量名組成的。
scanf函數(shù)中格式字符串的構(gòu)成與printf函數(shù)基本相同,但使用時有幾點不同。
(1)格式說明符中,可以指定數(shù)據(jù)的寬度,但不能指定數(shù)據(jù)的精度。例:
float a; scanf(“%10f”,&a); //正確 scanf(“%10.2f”,&a); //錯誤
(2)輸入long類型數(shù)據(jù)時必須使用%ld,輸入double數(shù)據(jù)必須使用%lf或%le。
(3)附加格式說明符“*”使對應(yīng)的輸入數(shù)據(jù)不賦給相應(yīng)的變量。
scanf()函數(shù)所用的轉(zhuǎn)換說明符與printf()所用的幾乎完全相同。主要區(qū)別在于printf()把%f、%e、%E、%g、%G同時用于float類型和double類型,而scanf()只是把他們用于float類型,而用于double類型時要求使用l(字母l)修飾符。
轉(zhuǎn)換說明符 | |
%c | 把輸入解釋成一個字符 |
%d | 把輸入解釋成一個有符號十進(jìn)制整數(shù) |
%e,%f,%g,%a | 把輸入解釋成一個浮點數(shù)(%a是C99的標(biāo)準(zhǔn)) |
%E,%F,%G,%A | 把輸入解釋成一個浮點數(shù)(%A是C99的標(biāo)準(zhǔn)) |
%i | 把輸入解釋成一個有符號十進(jìn)制整數(shù) |
%o | 把輸入解釋成一個有符號的八進(jìn)制整數(shù) |
%p | 把輸入解釋成一個指針(一個地址) |
%s | 把輸入解釋成一個字符串:輸入的內(nèi)容以第一個非空白字符作為開始,并且包含直到下一個空白字符的全部字符 |
%u | 把輸入解釋成一個無符號十進(jìn)制整數(shù) |
%x,%X | 把輸入解釋稱一個有符號十六進(jìn)制整數(shù) |
*修飾符在scanf中()的用法:
*在scanf()中提供截然不同的服務(wù),當(dāng)把它放在%和說明符字母之間時,它使函數(shù)跳過相應(yīng)的輸入項目。請參考程序事例:
/*用*跳過scanf接收的數(shù)字*/ #include<stdio.h> int main(void) { int num; printf("Please enter three number:\n"); scanf("%*d %*d %d",&num); printf("The last number is %d\n",num); return 0; }
gcc下運(yùn)行結(jié)果如下:
Please enter three number: 2014 2015 2016 The last number is 2016
scanf()的返回值:
scanf()函數(shù)返回成功讀入的項目的個數(shù)。如果它沒有讀取任何項目(比如它期望接收一個數(shù)字而您卻輸入的一個非數(shù)字字符時就會發(fā)生這種情況),scanf()返回0。
當(dāng)它檢測到“文件末尾”(end of file)時,它返回EOF(EOF在是文件stdio.h中的定義好的一個特殊值,一般,#define指令將EOF的值定義為-1)。當(dāng)您學(xué)過循環(huán)之后,或在參加ACM這樣的比賽及使用在線評測系統(tǒng)的時候會經(jīng)常用到這種寫法。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程