區分C語言中getch、getche、fgetc、getc、getchar、fgets、gets

來源:互聯網
上載者:User

首先,這兩個函數不是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'Null 字元結尾
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)時,表示讀入的已不是正常的字元,而是檔案結束符。但以上只適用於讀取文字檔的情況。現在ANSI C 已經允許用緩衝檔案系統處理二進位檔案,而讀入某一個位元組中的位元據的值有可能是-1,而這又恰好是EOF的值。這就出現了需要讀入有用資料,卻處理為“檔案結束”。feof(fp) 用來測試fp所指向的檔案目前狀態是否是“檔案結束”。如果想順序讀入一個二進位檔案資料,可以:

while(!feof(fp)){
   c = fgetc(fp);
   ...
}  

 

 

詳情請查閱C標準庫。

做個廣告,看看百度搜尋的到不。

索岩石業發展有限公司 http://www.suoyanstone.com/

索岩石業有限公司 http://www.suoyanstone.com/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.