NO IMAGE
C語言面試經常會考如下一道題,哪裡有錯誤:
#include <stdio.h> 
 
int main() 
{
    char string[100] = {‘\0’}; 
    gets(string); 
 
    printf(“輸入的字串是:%s \n”, string); 
 
    return 0; 
這段C程式可能有問題,問題就在於函式gets()的使用。
gets從標準輸入裝置讀字串函式,可以無限讀取,不會判斷上限,以回車結束讀取。所以如果輸入的字串超過100個,它也不會做檢測,此時就會發生溢位。

可以使用fgets函式來從檔案中讀取字串。fgtes函式原型是
char *fgets(char *buf, int bufsize, FILE *stream);
一般的教材都會對這個函式的用法作出解釋,這裡就不在詳述了,以下文字摘用百度百科的解釋:

百度百科對fgets函式的解釋
從檔案結構體指標stream中讀取資料,每次讀取一行。讀取的資料儲存在buf指向的字元陣列中,每次最多讀取bufsize-1個字元(第bufsize個字元賦’\0’),如果檔案中的該行,不足bufsize個字元,則讀完該行就結束。如若該行(包括最後一個換行符)的字元數超過bufsize-1,則fgets只返回一個不完整的行,但是,緩衝區總是以NULL字元結尾,對fgets的下一次呼叫會繼續讀該行。函式成功將返回buf,失敗或讀到檔案結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函式是否是出錯而終止的,應該藉助feof函式或者ferror函式來判斷。