1. 程式人生 > >scanf()函式鍵盤緩衝區殘餘資訊的問題!!!

scanf()函式鍵盤緩衝區殘餘資訊的問題!!!

2,在C語言中,如果使用字元型變數(就是char型)時在有連續輸入的情況下,很容易因為出現垃圾字元而導致程式的流程非法。
看下面,簡單的一段程式碼:
#include "stdio.h" 
main()
{
char a,b;
printf("input a:");
scanf("%c",&a); /*或a=getchar();*/
printf("a=%c\n",a);
printf("input b:");
scanf("%c",&b); /*或b=getchar();*/
printf("b=%c\n",b); 
}
這段程式碼確實挺簡單的,但是卻隱藏著很難發現的問題。當在執行了printf("input a:");這句後要求我們做輸入的時候,隨便輸入一個數,然後按回車,程式繼續往下執行。沒等我們做第二次輸入的時候程式就已經結束了。把scanf()換成getchar()也一樣存在問題。

為什麼會有這樣的問題呢?那是因為在我們做了第一次輸入時,並按下回車,使程式繼續執行。而那個回車也隨之進入了流當中。而遇到第二個scanf()時,scanf()把回車當作是第二次輸入的字元而接收。因此程式也就忽略了輸入而繼續執行了。這個回車就是在做輸入時產生的垃圾字元了。我第一次遇到它時,是我在寫迴圈時遇到的,由於垃圾字元的原因,使得迴圈提早結束,而破壞了我預期的流程(第一次見垃圾字元時鬱悶死我了)。那怎麼才能防止垃圾字元的破壞,或是避免它的呢?而我的解決方法只有兩種.
第一種方法是多定義一個字元變數,如char c;這樣。把變數c分別放到輸入後面。如:
a=getchar();
c=getchar();

……
b=getchar();
c=getchar();
這樣可以使垃圾字元自動進入變數c中,而不破壞我們正確的流程和輸入。如果是scanf()的話,可以按照下面的方式來寫:scanf(”%c%c”,&a,&c);這樣的效果跟使用getchar()是一樣的。
這樣的方法無疑是浪費了一個記憶體空間,而且增加了很多的冗餘程式碼。
第二種方法是使用getche()函式,而不使用scanf()和getchar()。這個函式也是接收字元的,但是它不等待回車的輸入!而直接把字元送入流中,這樣就可以避免垃圾字元的出現了。