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