程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 淺談C語言中scanf(),gets()函數區別與聯系

淺談C語言中scanf(),gets()函數區別與聯系

編輯:關於C語言

淺談C語言中scanf(),gets()函數區別與聯系


眾所周知,scanf函數和gets函數是從鍵盤輸入數據的函數。其基本函數功能這裡不做過多贅述,只對兩個函數易錯點深入分析。  
int main()
{
    char a[20];
    char b[20];
    char c[20];
    printf("請輸入a字符串\n");
    scanf("%s",&a);
    printf("請輸入b字符串\n");
    gets(b);
    printf("請輸入c字符串\n");
    gets(c);
    return 0;
}

 

      【分析】程序本意是輸入三個字符串,之所以用printf提示輸入是因為想更清楚地看清程序怎麼運作的,可以從運行界面看到程序提示輸入a字符串和c字符串,但是會越過b字符串不讓輸入。這裡會讓人感到困惑。   因為scanf函數在讀取字符串時,遇到回車、空格、制表符不會進行讀取或轉換,會捨棄掉它們以及它們後面的字符至緩沖區,最後在讀取的字符後面加上‘\0’.因此到了gets(b)的時候就會讀取緩沖區剩下的東西以及最後的換行符就結束了,所以程序不會提示輸入b字符串,但是從監視可以看到b中其實是讀取了字符串的。然後緩沖區無剩余字符gets(c)可以實現輸入c字符串。而且從這個程序也可以體現出來需要用到裡面有空格的字符串的時候可以用gets函數。   這裡還有一個注意點:在gets(c)讀取從鍵盤輸入的字符以及最後需要將緩沖區的數據刷新出去的回車符。它和scanf不同的是不會捨棄回車符至緩沖區中, 而是會丟棄換行符將其改為字符串結束標志‘\0’。所以我們一般喜歡使用這種帶有清理收尾工作的輸入函數。   最後一個點,我們可以看到b字符串其實讀取的是緩沖區中的垃圾數據。因此,為了避免輸入流緩沖區中垃圾數據對後續讀入的影響,需要清空緩沖區。 下面就介紹方法(不同平台)    C標准規定 fflush()函數是用來刷新輸出(stdout)緩存的。對於輸入(stdin),它是沒有定義的。但是有些編譯器也定義了 fflush( stdin )的實現,比如微軟的VC。其它編譯器是否也定義了 fflush( stdin )的實現應當查找它的手冊。GCC編譯器沒有定義它的實現,所以不能使用 fflush( stdin )來刷新輸入緩存。    對於沒有定義 fflush( stdin )的編譯器,可以使用 fgets()函數來代替它(比用 getchar()、scanf()等函數通用性好)。可以這樣忽略輸入流中留下的回車等其它輸入,從而使下一次的輸入總保持一個“干淨”的狀態。(這個是任何平台下都可以的) scanf函數讀取字符  
int main()
{
    char ch1;
    char ch2;
    char ch3;
    char ch4;
    scanf("%c",&ch1);
    scanf("%c",&ch2);
    scanf("%c",&ch3);
    scanf("%c",&ch4);
    return 0;
}

 

    【分析】用戶輸入'h'和' '和兩個回車符,在監視中可以看到,四個字符如願以償得到了用戶輸入操作的四個字符,也並沒有捨棄回車符到緩沖區。

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