對scanf的不了解,導(dǎo)致程序出錯,考試大把scanf的具體用法整理出來,希望大家可以共同進(jìn)步,有什么不對的地方可以提出來。
int scanf(char *format,...);
這應(yīng)該是scanf的標(biāo)準(zhǔn)形式。先說說關(guān)于他的返回值的問題。
庫函數(shù)幾乎都是有返回值的,有些人可能很奇怪,怎么很少人用過scanf的返回值呢?
scanf會返回成功接收到的變量數(shù)量的值。比如scanf("%d",&j"),與scanf("%d=",&j),如果接受成功的話返回值都是1
用如下語句作了測試
#include
int main (){
int j;
printf ("%d",scanf("%d\n",&j));
return 0;
}
如果你開始就輸入回車,程序會繼續(xù)等待你輸入,因?yàn)樵谳斎霐?shù)字的時候,scanf會跳過空白字符。(the c programming language 上說,scanf實(shí)際上是用getchar()接受由數(shù)字組成的字符串,再轉(zhuǎn)換成數(shù)字)
如果我輸入ctrl-z(unix上是ctrl-d)則會返回-1(隨編譯器而定).這實(shí)際上就是常量EOF的值,也就是所謂的返回eof
如果我鍵入的不是數(shù)字返回值就是0。但是如果我輸入浮點(diǎn)數(shù),又會怎么樣呢?
我舉的例子中同樣會返回1,但是緩沖區(qū)會留下垃圾,如果是scanf("%d%d",&a,&b);則會出錯。
這是可以使用一個庫函數(shù)fflush(stdin)來清除緩沖。不過貌似雨中飛燕大姐說這個用法是非標(biāo)準(zhǔn)的。K&R,只是說行為沒有定義,但我們可以使用while((c=getchar())!='\n'&&c!=EOF);同樣可以清除后面的垃圾!
int scanf(char *format,...);
這應(yīng)該是scanf的標(biāo)準(zhǔn)形式。先說說關(guān)于他的返回值的問題。
庫函數(shù)幾乎都是有返回值的,有些人可能很奇怪,怎么很少人用過scanf的返回值呢?
scanf會返回成功接收到的變量數(shù)量的值。比如scanf("%d",&j"),與scanf("%d=",&j),如果接受成功的話返回值都是1
用如下語句作了測試
#include
int main (){
int j;
printf ("%d",scanf("%d\n",&j));
return 0;
}
如果你開始就輸入回車,程序會繼續(xù)等待你輸入,因?yàn)樵谳斎霐?shù)字的時候,scanf會跳過空白字符。(the c programming language 上說,scanf實(shí)際上是用getchar()接受由數(shù)字組成的字符串,再轉(zhuǎn)換成數(shù)字)
如果我輸入ctrl-z(unix上是ctrl-d)則會返回-1(隨編譯器而定).這實(shí)際上就是常量EOF的值,也就是所謂的返回eof
如果我鍵入的不是數(shù)字返回值就是0。但是如果我輸入浮點(diǎn)數(shù),又會怎么樣呢?
我舉的例子中同樣會返回1,但是緩沖區(qū)會留下垃圾,如果是scanf("%d%d",&a,&b);則會出錯。
這是可以使用一個庫函數(shù)fflush(stdin)來清除緩沖。不過貌似雨中飛燕大姐說這個用法是非標(biāo)準(zhǔn)的。K&R,只是說行為沒有定義,但我們可以使用while((c=getchar())!='\n'&&c!=EOF);同樣可以清除后面的垃圾!