程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> iOS開發入門 ☞ C言語(緩沖區問題)

iOS開發入門 ☞ C言語(緩沖區問題)

編輯:關於C++

iOS開發入門 ☞ C言語(緩沖區問題)。本站提示廣大學習愛好者:(iOS開發入門 ☞ C言語(緩沖區問題))文章只能為提供參考,不一定能成為您想要的結果。以下是iOS開發入門 ☞ C言語(緩沖區問題)正文


緩沖區: 輸出緩沖區

  鍵盤—》鍵盤緩沖區—》輸出緩沖區—》順序(scanf函數)

  我們在鍵盤上輸出的任何東西,會先進入輸出緩沖區區域,然後順序從輸出緩沖區裡把數據一個一個讀出來。

 

輸出緩沖區的管理方式:

  先進入的數字會被先讀出來(輸出緩沖區裡把後面的數字讀走了,才干讀前面的數字)

  1. scanf就是從輸出緩沖區裡拿數字,假如輸出緩沖區的內容和scanf指定的格式類型不一樣,它就不動,不會把輸出緩沖區裡的任何內容轉移走。
  2. 所以你用scanf讀一個%d,輸出緩沖區輸出一個[a 10],用scanf讀取一個整數的時分,它讀出來的a發現不是一個整數,它又把這個a放回去了。下回再讀,還是讀的這個a。a一直堵在緩沖區內,前面的數據10讀不到。
  3. 為理解決這個問題,我們在每次讀取一個數據後,把輸出緩沖區裡的數據全清算掉,我不論外面有什麼,我這次讀完了當時也不論這次是讀到還是沒讀到,反正我這次讀完了當時把輸出緩沖區全部清算掉,這樣的話我保證你下一次讀的時分是一個新的開端。
  4. 每次讀完一個數據後,把輸出緩沖區裡的數據全部清算掉,保證下一次再讀的時分一定是一個新的開端,這樣就不會由於前一次的錯誤招致後一次出問題。【清算輸出緩沖區的目的:後面的輸出出錯了,保證不會影響前面的輸出】

 

  每次讀完一個數據後清算輸出緩沖區,保證後面的輸出出錯了,不會影響前面的輸出

    scanf("%*[^\n]");

    scanf("%*c");

 

  輸出緩沖區有這樣的一個特點:只要當其中的數據讀走的時分,才會肅清這個數據。

  scanf(數據類型)弛緩沖區中的數據類型不分歧的時分,便無法讀走數據,能夠會招致死循環。

處理下面問題的方法:

  scanf("%*[^\n]");//*疏忽讀到的內容,[^\n]任何非\n的字符;將\n之前的一切字符讀走

  scanf("%*c");//從緩沖區讀取一個字符疏忽掉

  補充:scanf調用失敗(次要緣由:類型不婚配)前往渣滓值。

char ch;

//上面兩行可以完全請空緩沖區中的一行內容

scanf("%*[^\n]");//先將換行符之前的所有內容都清掉

scanf("%c", &ch);//再將\n從輸出緩沖區讀走

 

scanf的運轉原理
  1. scanf假如發現輸出緩沖區中沒有東西,就啟動錄入
  2. scanf發現輸出緩沖區中有\n,那麼他就會去輸出緩沖區取值
  3. 假如發現是自己的菜就會取走放到自己盤子裡
  4. 假如不是自己的菜,就會自己回去了

 

   

    

//反省輸出格式能否正確

#include <stdio.h>

int main() {

    int num=0;//初始化清零

    printf("請輸出一個數字:");

    while (!scanf("%d",&num)) {

        scanf("%*[^\n]");

        scanf("%*c");

        printf("輸出格式錯誤!\n請輸出一個數字:");

    }

    printf("輸出正確!num=%d\n",num);

    return 0;

}

   

  每次運用scanf函數讀數據後都需求清算輸出緩沖區!

    

輸入緩沖區:

  順序(printf函數)->輸入緩沖區->屏幕

 

  順序的輸入可以抵達屏幕的條件

  輸入緩沖區內容顯示在屏幕上的條件(至多滿足一個):

  1. 遇到\n
  2. 順序完畢(函數完畢)
  3. 輸入緩沖區滿了
  4. 運用fflush(stdout)強迫刷新(人工刷新)
舉例:

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved