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()。這個函數也是接收字符的,但是它不等待回車的輸入!而直接把字符送入流中,這樣就可以避免垃圾字符的出現了。