當(dāng)讀入發(fā)生錯(cuò)誤,或者是到達(dá)文件尾,scanf就會(huì)返回EOF這個(gè)宏的值。
while(scanf("%d%d",&a,&b)!=EOF),這個(gè)語句就是說,當(dāng)讀取沒有到達(dá)文件尾的話,就不停的讀取。
scanf 函數(shù)的返回值反映的是按照指定的格式符正確讀入的數(shù)據(jù)的個(gè)數(shù)。如果輸入數(shù)據(jù)與指定格式不符,則會(huì)產(chǎn)生輸入錯(cuò)誤。遇到輸入錯(cuò)誤,scanf函數(shù)會(huì)立即終止,返回已經(jīng)成功讀取的數(shù)據(jù)的個(gè)數(shù)。所以,通過scanf函數(shù)的返回值和指定輸入數(shù)據(jù)的個(gè)數(shù)(由格式符決定)的比較,可以判斷數(shù)據(jù)輸入是否成功。
scanf("%d%d",&a,&b); 這個(gè)語句會(huì)去讀兩個(gè)整型到a, b。如果讀取成功,應(yīng)該返回2。就是它成功讀取變量的個(gè)數(shù)。
論壇上很多人對(duì)scanf的不太了解,導(dǎo)致程序出錯(cuò),我想把scanf的具體用法貼出來,希望大家可以共同進(jìn)步,有什么不對(duì)的地方可以提出來。
int scanf(char *format,...);
這應(yīng)該是scanf的標(biāo)準(zhǔn)形式。先說說關(guān)于他的返回值的問題。
庫函數(shù)幾乎都是有返回值的,有些人可能很奇怪,怎么很少人用過scanf的返回值呢?
scanf會(huì)返回成功接收到的變量數(shù)量的值。比如scanf("%d",&j"),與scanf("%d=",&j),如果接受成功的話返回值都是1
我用如下語句作了測(cè)試
#include <stdio.h>
int main (){
int j;
printf ("%d",scanf("%d\n",&j));
return 0;
}
如果你開始就輸入回車,程序會(huì)繼續(xù)等待你輸入,因?yàn)樵谳斎霐?shù)字的時(shí)候,scanf會(huì)跳過空白字符。(the c programming language 上說,scanf實(shí)際上是用getchar()接受由數(shù)字組成的字符串,再轉(zhuǎn)換成數(shù)字)
如果我輸入ctrl-z(unix上是ctrl-d)則會(huì)返回-1(隨編譯器而定).這實(shí)際上就是常量EOF的值,也就是所謂的返回eof
如果我鍵入的不是數(shù)字返回值就是0。但是如果我輸入浮點(diǎn)數(shù),又會(huì)怎么樣呢?
我舉的例子中同樣會(huì)返回1,但是緩沖區(qū)會(huì)留下垃圾,如果是scanf("%d%d",&a,&b);則會(huì)出錯(cuò)。
這是可以使用一個(gè)庫函數(shù)fflush(stdin)來清除緩沖。不過貌似雨中飛燕大姐說這個(gè)用法是非標(biāo)準(zhǔn)的。K&R,只是說行為沒有定義,但我們可以使用while((c=getchar())!='\n'&&c!=EOF);同樣可以清除后面的垃圾
scanf的格式匹配還是比較簡(jiǎn)單,一定要記住的就是普通變量一定要加上&,否則編譯器無法檢測(cè)錯(cuò)誤,但運(yùn)行肯定會(huì)段錯(cuò)誤。
┏━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 代 碼 │ 意 義 ┃
┠────┼────────────────────────────┨
┃ %a │讀浮點(diǎn)值(僅適用于 C99) ┃
┃ %A │讀浮點(diǎn)值(僅適用于 C99) ┃
┃ %c │讀單字符 ┃
┃ %d │讀十進(jìn)制整數(shù)