它是格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中。
使用scanf函數時要加上#include <stdio.h>。
首先從鍵盤讀入鍵盤緩沖區(buffer)的數據都是以ASCII碼存儲的(包括回車)。
例如:
#incude<stdio.h>
int main()
{
char a;
char b;
scanf("%c",&a);
scanf("%c",&b);
printf("%c%c",a,b);
return
0;
}
終端操作:w[回車]
w
顯然這個程序只輸入一次,輸出一次。
第一次回車後,buffer中的ASCII:
XX,0AH(0A是換行的ASCII), scanf會根據格式字符串中的第一個%c從對buffer按字節順序讀取,因為‘\n’也是一個字符,所以當讀取到0A時,會將字符‘\n’給變量b。讀取數據結束,此時buffer中已經無任何數據了。
自然打印出來的就是w\n,兩個字符。
解決辦法是:
#incude<stdio.h>
int main()
{
char a;
char b;
scanf("%c",&a);
getchar();
scanf("%c",&b);
printf("%c%c",a,b);
return
0;
}
當用戶鍵入回車之後,getchar才開始從stdio流中每次讀入一個字符,在輸入w[回車]時,buffer中的ASCII:
XX,0AH(0A是換行的ASCII),getchar 開始讀取字符,並顯示在屏幕上,此時buffer中是沒有數據,在這兒getchar()起到了清除緩沖區的作用,這樣,當遇到達爾戈scanf 是,可以正常輸入,並顯示在屏幕上。
在scanf讀取的一個參數是數時,開始輸入的空白字符會被忽略,讀取數字直到遇到第一字符不是數字就會停止;
讀取字符串時,開始的空白字符也會被忽略掉,讀取字符【0-9a-zA-Z....](各種可顯示字符),直到遇到不是字符停止匹配,(包括空白字符,通常為回車換行),並且在字符串尾添加空字符,(空字符是字符串輸出結束字符).
scanf遇到停止字符時,把停止字符還放入鍵盤字符緩存區中。
匹配格式
int a;
char x[20];
printf("Hello, world\n");
scanf("%d%s",&a,x);
printf("%d",a)
printf("%s",x);
getch();
如果輸入.......123 .....hello[回車]
輸出 hello,world
123hello
如果將輸入改成scanf("%dabc%s",&a,x);
輸入:....123abc.......hello
輸出結果如上
輸入:......123ab......hello
輸出結果123字符數組輸出為亂碼。
建議:當此次輸入結束時,不管正確與否,都要刷新緩存區,否則有滯留字符干擾下一次的輸入,使用getchar().