一、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()替代……