C語言中連續多次scanf無法成功運行的問題簡析

當有連續多個scanf()時,有時候能成功運行而有時候卻無法讀入數據。經過一段時間的調試,發現並無語法錯誤,則應該是C語言對此函數的一些歷史遺留問題了。在向他人提問和網上搜索後,終於解決如次問題。原因如下:

scanf無法連用,主要是因爲緩衝區不足,提交緩衝就好了。stdin 默認的緩衝區給了4k  加上一些系統的東西. 4k很快就不夠用了。另一個原因是,第一scanf()接受一個字符輸入,當你輸入一個字符後按下回車,只有你輸入的那個字符被賦給了a,而剩下的一個換行符還保留在緩衝中,當第二次輸入時 無論你輸入的什麼字符,都是無效的,緩衝就如堆棧,符合先進先出原則,既然你緩衝中先前有個換行符,那麼系統在遇見第二個scanf時自動會將換行符賦給 b,所以輸入的東西都是無效的....所以 fflush 一下就可以解決此問題。最好在每個scanf前加上fflush( stdin );保證正常運行。

那麼getch和getchar是否會產生這樣的問題呢?答案是不會。具體過程尚未研究。同時,推薦大家以後在需要使用scanf時用scanf_s來代替,這也是爲什麼VS2010中,大家總會看到一條warning就是提示不要使用scanf而使用scanf_s的原因。

ex:

#include <stdio.h>
#include <stdlib.h>

int main ( void )
{
 float a,b,c,d,e;
 char dtm;

 printf("What are the cooeficients of second order sections?\n");
 scanf("%f %f", &a, &b);

 c = -b;
 d = a + a;
 e = a * a - b * c;

 printf("The coefficients are:  %f %f \n",d,e);

 printf("Do you want to continue calculating?(Y/N)");

 fflush( stdin );
 scanf("%c", &dtm);
 if (dtm=='Y')
  printf("The coefficients are:  %c \n",dtm);
 else
  printf("NNNNNNNN\n");

 return 0;
}
 

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