解決scanf輸入數值問題(stdin==0 or stdin==1)【用fflush(stdin)非正確方式】

關於使用scanf("%d")、scanf("%f")、scanf("%lf")來接收數值時,如何限制僅接收數值,且避免出現錯誤。
當要使用scanf功能時,原理其實是把鍵盤所打的內容,先顯示在終端機上,當下並沒有任何存取的動作,當我們按下Enter按鍵時(也等於'\n'),就是把鍵盤所要輸入的內容先放到stdin的位置,然後scanf指令才會把暫存在stdin位置的內容讀取進來,至於所需要讀取的內容為何,就是看我們給予的讀取指令內容(%d、%f、%lf、%c、%s、%zu.....等等)。
其實當接收完成時候,stdin會回傳一個數值,接收成功傳1,失敗傳0,可以利用這個回傳值來控制程式執行反映,避免出現意外的方式。
因為當要讀取一個int數值時,鍵盤打ABC,按下Enter時,ABC會暫放在stdin中,直到等待適合的指令內容讀取(若符合成功讀取,stdin內容就會不見),若使用迴圈讀取int數值時(成功符合後跳脫迴圈繼續後面程式,失敗則繼續迴圈),因ABC不是int數值,所以迴圈會 一直執行,就會無限循環無法跳脫(scanf一直循環讀取到ABC),所以要再讓使用者重新輸入,就必須要先清除stdiin內容,目前我使用fflush去清除其內容【fflush(stdin)】,相信還有其他方式可以解決這個問題。

使用者輸入非整數時,需重新讓使用者輸入,直到讀取到int數值,接收到數值時將stdin丟到指定且取址的變數位置。
#include<stdio.h>
int main(){
float a;
while(scanf("%f",&a)!=1){
printf("please key integer\n");
fflush(stdin);
}
printf("%.3f\n",a);
return 0;
}

留言