scanf()函數返回成功賦值的數據項數,讀到文件末尾出錯時則返回EOF。
ret=scanf
(
"%d%d"
,&a,&b);
如果a和b都被成功讀入,那麼scanf的返回值就是2
如果只有a被成功讀入,返回值爲1
如果a和b都未被成功讀入,返回值爲0
格式說明符
轉換字符(就是%後跟的部分)
a 讀浮點值(僅適用於 C99)
A 讀浮點值(僅適用於 C99)
c 讀單字符
d 讀十進制整數
i 讀十進制、八進制、十六進制整數
e 讀浮點數
E 讀浮點數
f 讀浮點數
F 讀浮點數(僅適用於 C99)
g 讀浮點數
G 讀浮點數
o 讀八進制數
s 讀字符串
x 讀十六進制數
X 讀十六進制數
p 讀指針值
n 至此已讀入值的等價字符數
u 讀無符號十進制整數
[ ] 掃描字符集合
% 讀 % 符號(百分號)
L/l 長度修飾符 輸入"長"數據
h 長度修飾符 輸入"短"數據
W 整型常數 指定輸入數據所佔寬度
空白符
空白字符會使scanf()函數在讀操作中略去輸入中的一個或多個空白字符。
非空白符
一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。
例子:
(1) 如果格式控制串中有非格式字符則輸入時也要輸入該非格式字符。
例如:
|
scanf ( "%d,%d,%d" ,&a,&b,&c); |
其中用非格式符“ , ”作間隔符,故輸入時應爲:
|
5,6,7 |
又如:
|
scanf ( "a=%d,b=%d,c=%d" ,&a,&b,&c); |
則輸入應爲
a=5,b=6,c=7
(2)鍵盤緩衝區殘餘信息問題
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include<stdio.h> intmain( void ) { inta; charc; while (c!= 'N' ) { scanf ( "%d" ,&a); scanf ( "%c" ,&c); printf ( "a=%dc=%c\n" ,a,c); /*printf("c=%d\n",c);*/ } return0; } |
scanf("%c", &c);這句不能正常接收字符,什麼原因呢?我們用printf("c = %d\n", c);將C用int表示出來,啓用printf("c = %d\n", c);這一句,看看scanf()函數賦給C到底是什麼,結果是c=10 ,ASCII值爲10是什麼?換行即\n.對了,我們每擊打一下"Enter"鍵,向鍵盤緩衝區發去一個“回車”(\r),一個“換行"(\n),在這裏\r被scanf()函數處理掉了(姑且這麼認爲吧^_^),而\n被scanf()函數“錯誤”地賦給了c.解決辦法:可以在兩個scanf()函數之後加getch(), getchar(),但是要視具體scanf()語句加那個,這裏就不分析了,讀者自己去摸索吧。
(3)如何處理scanf()函數誤輸入造成程序死鎖或出錯
1
2
3
4
5
6
7
8
9
|
#include<stdio.h> intmain( void ) { inta,b,c; scanf ( "%d,%d" ,&a,&b); c=a+b; /*計算a+b*/ printf ( "%d+%d=%d" ,a,b,c); return0; } |
如上程序,如果正確輸入a,b的值,那麼沒什麼問題,但是,你不能保證使用者每一次都能正確輸入,一旦輸入了錯誤的類型,你的程序不是死鎖,就是得到一個錯誤的結果,呵呵,這可能所有人都遇到過的問題吧?解決方法:scanf()函數執行成功時的返回值是成功讀取的變量數,也就是說,你這個scanf()函數有幾個變量,如果scanf()函數全部正常讀取,它就返回幾。但這裏還要注意另一個問題,如果輸入了非法數據,鍵盤緩衝區就可能還個有殘餘信息問題。正確的例程:
1
2
3
4
5
6
7
8
9
10
|
#include<stdio.h> intmain( void ) { inta,b,c; while ( scanf ( "%d%d" ,&a,&b)!=2) fflush (stdin);
//可能不兼容 c=a+b; printf ( "%d+%d=%d" ,a,b,c); return0; } |