区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets
?
首先,這兩個函數不是C標準庫中的函數,?
?
int?getch(void) //從標準輸入讀入一個字符,當你用鍵盤輸入的時候,屏幕不顯示你所輸入的字符。也就是,不帶回顯。?
int?getche(void)? //從標準輸入讀入一個字符,鍵盤輸入的時候,屏幕顯示所輸入的字符。帶回顯。?
?
這兩個函數包含在頭文件conio.h中,需要記住的是conio.h不是C標準庫中的頭文件。Micorsoft?和?Borland的?C編譯器提供了conio.h,用來創建控制臺文本用戶界面。一般在Windows系統下安裝了VS、VC等,就可以包含conio.h頭文件。但是一般在Unix、Linux系統中,?/?usr?/?include?/?中都沒有這個頭文件。?
?
getch和getche在等待用戶從鍵盤輸入的時候,用戶按下一個鍵后,不需要按回車,程序自動往下執行。在Linux中,終端輸入在缺省情況下是被“一鍋端”的,也就是說整行輸入是被一起處理的。通常,這是一種人們所希望的方便的辦法,但它也意味著在讀入數據時必須按一下回車鍵表示輸入行結束后才能得到輸入的數據。在游戲中,很多都提供了“老板鍵”,它的實現,就是利用了這兩個函數。?
?
?
?
其次,除了getch和getche,其他的都是C標準庫中的頭文件,包含在頭文件stdio.h中。?
?
?
int?fgetc?(?FILE?*stream?);??//從流stream中讀一個字符。可以將標準輸入stdin作為它的實參,這時候從標準輸入讀取一個字符。?
?
int?getc(FILE?*stream);??????//和fgetc等效,由fgetc通過宏實現。?
int?getchar?(?void?);?
?//從標準輸入stdin讀入一個字符,程序等待你輸入的時候,你可以輸入多個字符,回車后程序繼續執行。?
//但getchar只讀入一個字符?
說明:?
getc、getchar都是通過宏定義借助fgetc實現。如getchar的實現為,#define?getchar()?fgetc(stdin)。?
?
char?*fgets?(char?*str,?int?num,?FILE?*stream);?
?//從流stream中讀入最多num個字符到字符數組str中,當遇到換行符時、或讀到num-1個字符時停止。?
?//自動加上'\0'空字符結尾?
?
?
char?*gets?(?char?*str?);?
//從標準輸入stdin讀取一個字符串,遇到換行或結束時候終止。?
?//不同于fgets,他沒有指定num,所以需要注意字符數組str的大小。?
?
說明:?fgets和gets之間沒有宏定義的關系,彼此各自有自己的實現。蠕蟲病毒的實現就是函數gets的“功勞”。gets函數的任務是從流中讀入一個字符串。它的調用者會告訴它把讀入的字符串放在什么地方。但是,gets()函數并不檢查緩沖區大小,如果調用者提供了一個指向堆棧的指針,并且get()函數讀入的字符數量超過了超過了緩沖區的空間大小,get()會愉快地將多出來的字符繼續寫入到堆棧中,這就覆蓋了堆棧中原來的內容。如:?
?
main()?
{?
????char?line[512];????//在程序的堆棧上分配512個字符的空間?
????...?
????gets(line);????????//蠕蟲病毒的入口,可以將惡意代碼通過多出來的數據寫入堆棧?
}?
?
?
?
建議不要用getch和getche,因為它們不是C標準庫中的函數。用它們寫出的程序可移植性差,不同的編譯器不保證可以包含conio.h。建議用fgets函數徹底替代gets函數。?
?
?
?
另外,絕大多數的這些get函數,都有對應的put版本。?
?
int?fputc?(?int?character,?FILE?*stream?);?
?
int?putc?(?int?character,?FILE?*stream?);????????//通過宏定義和fputc實現?
?
int?putchar?(?int?character?);?
//通過宏定義實現:#define?putchar(c)?fputc(c,?stdout)?
?
?
?
int?fputs?(?const?char?*str,?FILE?*stream?);?
?
int?puts?(?const?char?*str?);?
?
說明:兩者之間無宏定義實現關系。puts(const?char?*str)近似等效于fputs(cosnt?char?*str,?stdout),不同點是前者還輸出一個'\n'?
?
?
?
最后,關于EOF?
?
EOF是在stdio.h文件中定義的符號常量,值為?-1。如,?
?
fputc函數返回一個值:如果輸出成功則返回值就是輸出的字符;如果輸出失敗,則返回一個EOF。?
?
fgetc函數讀字符時遇到文件結束符,函數返回一個文件結束標記EOF。如果想從一個磁盤文件順序讀入字符并在屏幕上顯示,可以:?
?
ch?=?fgetc(fp);?
while(ch?!=?EOF)?
{?
????putchar(ch);?
????ch?=?fgetc(fp);?
}?
?
?
注意,EOF不是可輸出字符,因此不能在屏幕上顯示。由于ASCII碼不可能出現?-1,因此EOF定義為?-1是合適的。當讀入的字符值等于?-1(即?EOF)時,表示讀入的已不是正常的字符,而是文件結束符。但以上只適用于讀取文本文件的情況?,F在ANSI?C?已經允許用緩沖文件系統處理二進制文件,而讀入某一個字節中的二進制數據的值有可能是?-1,而這又恰好是EOF的值。這就出現了需要讀入有用數據,卻處理為“文件結束”。feof(fp)?用來測試fp所指向的文件當前狀態是否是“文件結束”。如果想順序讀入一個二進制文件數據,可以:?
?
while(!feof(fp))?
{?
????c?=?fgetc(fp);?
????...?
}?
===================================================
getch,getchar這兩個以前用過,可是遇到了getche,頭一次,此時用一小段代碼部分測試就知道了。 代碼1: ------------------------------------------------------------------------getch() #include<stdio.h> int main() -------------------------------------------------------------------- 當我輸入 6 字符在下一行就顯示了,我的 輸入就沒有輸入? ,回車也沒有 代碼2: -----------------------------------------------------------------getchar(); #include<stdio.h> int main() --------------------------------------------------------------------- 小結:我輸入? 6之后? 回車 之后字符輸入了進去,此時出現的輸入顯示,并且中間空格了 代碼3: --------------------------------------------------------------------------------------------------------getche();? #include<stdio.h> int main() ---------------------------------------------------------------------------------------------------- 小結:我只是輸入了一個 6? 并沒有回車,輸入的字符顯示,并且自動轉入下一行繼續執行。 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 經過上面的代碼運行,以及運行之后的比較,三種字符輸入,或多或少的有細微的差別,通過運行截圖,已經看出來了。我想讀者應當自己試試,才能有體會,其實測試代碼很簡單,也很模塊化,試試看看吧! |
總結
以上是生活随笔為你收集整理的区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets的全部內容,希望文章能夠幫你解決所遇到的問題。