天天看點

scanf、getchar和gets的差別

一、scanf

函數作用:按照變量在記憶體的位址将變量值存進去。

一般格式:scanf(格式控制,位址表列)

其中,格式控制:

%d:以帶符号的十進制形式輸出整數

%o:以八進制無符号形式輸出整數

%x:以十六進制無符号形式輸出整數

%u:以無符号十進制形式輸出整數

%c:以字元形式輸出,隻輸出一個字元

%s:輸出字元串

我們知道在用printf時,習慣性的在字元後面加\n,在這裡我需要提醒一下,scanf中不需要。

另外,在輸入字元串時,例如scanf(“%s”,str),其中的str作為數組名本身就是位址,是以千萬别寫成&str。

getchar

getchar在被調用時從文本流讀入輸入的字元并且将其作為結果傳回。

getchar有一個int型的傳回值.當程式調用getchar時.程式就等着使用者按鍵.使用者輸入的字元被存放在鍵盤緩沖區中.直到使用者按回車為止(回車字元也放在緩沖區中).當使用者鍵入回車之後,getchar才開始從stdin流中每次讀入一個字元.getchar函數的傳回值是使用者輸入的第一個字元的ASCII碼,如出錯傳回-1,且将使用者輸入的字元回顯到螢幕.如使用者在按回車之前輸入了不止一個字元,其他字元會保留在鍵盤緩存區中,等待後續getchar調用讀取.也就是說,後續的getchar調用不會等待使用者按鍵,而直接讀取緩沖區中的字元,直到緩沖區中的字元讀完為後,才等待使用者按鍵.

getchar不能以回車結束。

#include<stdio.h>
#include<conio.h>
main(void)
{
    int c;
    int a;
    a=getchar();

    if (EOF!=a)
        printf("%c",a);

    while((c=getchar())!='\n')//c接收的值是輸入第一個字元後按下的回車換行符'\n',c是不會顯示的
    {
        if (EOF==a)
            break;
        printf("%d",c);
    }
    getchar();
}
           

getchar隻能輸入單個字元。要想輸入字元串,還得用gets。

gets

gets從标準輸入裝置讀字元串函數。可以無限讀取,不會判斷上限,以回車結束讀取。讀入成功,傳回與參數buffer相同的指針;讀入過程中遇到EOF(End-of-File)或發生錯誤,傳回NULL指針。是以在遇到傳回值為NULL的情況,要用ferror或feof函數檢查是發生錯誤還是遇到EOF。

scanf與gets

異同:

scanf不能接受空格、制表符Tab、回車等;

而gets能夠接受空格、制表符Tab和回車等;

它們字元串接受結束後自動加\0;

scanf :當遇到回車,空格和tab鍵會自動在字元串後面添加’\0’,但是回車,空格和tab鍵仍會留在輸入的緩沖區中。

gets:可接受Enter鍵之前輸入的所有字元,并用’\n’替代 ‘\0’.Enter鍵不會留在輸入緩沖區中。

是以,gets和scanf本質上沒有什麼差別,都是接收字元串,不過,getchar隻能接受字元。

哦,對了,由于gets沒有上限,使用時得保證空間足夠大,以保證讀取是不會溢出。

由于可以無限讀取,是以在2011年12月,ANSI 采納了 ISO/IEC 9899:2011 标準,标準中删除了 gets()函數,使用一個新的更安全的函數gets_s()替代……

繼續閱讀