1. 程式人生 > >C語言中getchar()、gets()和scanf()的特點以及scanf產生的多餘回車符問題

C語言中getchar()、gets()和scanf()的特點以及scanf產生的多餘回車符問題

     第一件事建議大家少用gets函式。   

    我遇到的這個問題實在是C語言新手比較容易遇到的一個問題。是關於get()和getchar()這兩個函式的。大家都知道,gets()函式作用是輸入字串,而getchar()是輸入單個字元。但在一個小程式中,我發現了它們兩個一些別的用法。

   因為原始檔的程式碼很長,所以只打上原始檔中涉及到這個問題的一個函式:

void input(num,name)
{
    int num[];
    char name[10][8];
    int i;
    
    for(i=0;i<N;i++)
    {
        printf("\n input number :");
        scanf("%d",&num[i]);
        printf("\n intput name");
        getchar();
        gets(name[i]);
    }
}


    函式是想要輸入十名同學的學號和姓名。

    剛開始,我認為在gets函式前有加了一個getchar函式是多餘的。於是我便刪除了開頭的那段程式碼,但是結果卻無法執行。

總是在輸完num[i]的資料後直接跳過了輸入name[i]的過程。

    百思不得其解的我只好去翻查資料。

    最終我找到了問題的答案。

    使用scanf函式,在輸入完字元後,要按一下回車鍵。原本輸入的字元都儲存在快取區中,在按下回車鍵後便被讀取到變數中。但是在按下回車後多餘了一個回車符,getchar()的作用就是把這個回車符讀取掉,否則就被gets()函式讀取,直接跳過了下一個變數的輸入。(此處也可以使用gets())

    那麼問題就又出現了,為什麼兩個scanf函式就可以連續使用呢?

    這就是gets函式和scanf函式的不同了:

     scanf函式在輸入整型資料時不能接受空格、製表符Tab、回車等;

gets函式能夠接受空格、製表符Tab和回車等;

    這就是可以連續使用scanf函式的原因。

    除此之外,兩者還有不同點:

    scanf函式如果輸入了空格(空格鍵和tab鍵)會認為字串結束,空格後的字元將作為下一個輸入項處理,但gets()函式將接收輸入的整個字串直到遇到換行為止

     在這裡也存在一個問題,並不是在所有的scanf後面都要加上getchar()。因為我們產生的回車符為字元,所以只對使用scanf輸入字元時有影響,也在輸入字元前必須把回車符吸收掉。

     最後再補充一下這三個函式各自的返回值:

    1.scanf函式

    scanf函式的返回值可以分成三種情況
    1) 正整數,表示正確輸入引數的個數。例如執行 scanf("%d %d", &a, &b);
        如果使用者輸入"3 4",可以正確輸入,返回2(正確輸入了兩個變數);
        如果使用者輸入"3,4",可以正確輸入a,無法輸入b,返回1(正確輸入了一個變數)。
    2) 0,表示使用者的輸入不匹配,無法正確輸入任何值。如上例,使用者如果輸入",3 4",返回0。
    3) EOF,這是在stdio.h裡面定義的常量(通常值為-1),表示輸入流已經結束。

    2.gets函式

    函式原型:char *gets(char *string)

    格式:gets(字元陣列或指標);

    gets函式的返回值:
    1.)正常讀入(未遇到檔案結尾)(注意,讀入空串也是正常讀入),則返回字串,即返回字串首地址,char*型別。
    2.)遇到檔案結尾,返回NULL。

     3.getchar函式

    它的返回值顯而易見。

    char a;

    a=getchar();

    就是我們從鍵盤輸入的一個字元。

    文章寫到這裡,我感覺我自己很有必要去看看C語言的各種標準標頭檔案中是怎麼定義這些函式的,對自己的幫助一定很大,要加緊開始了!