scanf函數緩衝區問題探究

 前幾天在網上看到一段代碼,就把其中的一段給摘下來研究了一下。代碼如下:
 

點擊(此處)摺疊或打開

  1. int a[10];

  2. for(i=0;=<10,i++)
  3.  scanf("%d",a[i]);

    代碼很簡單,就是輸入十個整型值賦給一個數組。但是我一不小心輸了一個字符,最後這個循環就直接跳出了。我還以爲這個程序有問題,所以我就寫了另外一個小程序來驗證。
 
 
 

點擊(此處)摺疊或打開

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int a[10]; 
  5.     int *= NULL;
  6.     p = a;
  7.     int i,count=0;

  8.     for(= 0;< 10;i++) 
  9.     //打印未給A賦值前的值,確定scanf函數是否起作用
  10.     //實際上A是亂碼,但是爲了和後面值比較,所以將其打印
  11.     {
  12.         printf("pointer is : %d\n",p[i]);
  13.     }
  14.     for(= 0;< 10;i++)
  15.     {
  16.       count += (int) scanf("%d",&a[i]);
  17.       }
  18.      for(= 0;< 10;++)
  19.      {
  20.          printf("A%d:%d\n",i+1,a[i]);
  21.   
  22.       }
  23.     printf("\nsuccess : %d\n",count);
  24.     //打印scanf函數成功接收幾個值
  25.     return 0;

  26. }

 
    最後的結果是第一次輸入一個字符常量W就直接執行所有步驟。數組A[]所有值都未賦值,都爲內存中的亂碼,但是循環執行了10次。當時我就愣了,爲什麼scanf函數會一次都沒有執行(count=0)?

 
    我找到對scanf()函數描述:大致意思就是輸入的常量先放到緩衝中,然後scanf()函數一個一個從buffer中讀取。我的程序所出的問題就是這個字符常量W一直放在buffer中,十次循環scanf()一直就在讀取這一個值,每讀一次,scanf()函數就會與格式說明相比較,不符函數終止並返回0.這就是問題所在。

 
    還有,有時候當我們利用scanf()函數輸入一個常量時,我們再按下回車後這個回車就存在buffer中,如果下面還有scanf()就會出錯。
 
    解決的辦法就是利用do,while解構消除回車;
 

點擊(此處)摺疊或打開

  1. do

  2. {
  3.         //program code 
  4. }

  5. while(gechar() == '\n');


 
這樣就可以消除回車鍵對下面scanf()輸入的影響了。
 
發佈了0 篇原創文章 · 獲贊 1 · 訪問量 8547
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章