scanf

scanf()函數返回成功賦值的數據項數,讀到文件末尾出錯時則返回EOF。
ret=scanf("%d%d",&a,&b);
如果a和b都被成功讀入,那麼scanf的返回值就是2
如果只有a被成功讀入,返回值爲1
如果a和b都未被成功讀入,返回值爲0
如果遇到錯誤或遇到end of file,返回值爲EOF且返回值爲int型.

格式說明符

轉換字符(就是%後跟的部分)
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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章