對fgets的理解


gets()函數

    因為用gets函數輸入數組時,只知道數組開始處,不知道數組有多少個元素,輸入字符過長,會導致緩沖區溢出,多余字符可能占用未使用的內存,也可能擦掉程序中的其他數據,后續用fgets函數代替。

fgets函數

    一小段代碼舉例:

    

1 char words[stlen]; 2     fgets(words,10,stdin); 3      fputs (words,stdout); 4     puts(words);

 

    (1)  fgets函數一次讀入10 - 1個字符,如果少於這個字符數數按下回車

    例如輸入apple pie 則會將apple pie\n\0儲存在數組中

    隨后的fputs打印時不添加\n

    而puts打印會添加\n,結果會空一行

    (2) 一次讀入超過10 - 1個字符則會在讀取apple pie后加\0儲存在數組中

      打印時因為沒有\n    函數fputs之后沒有換行,緊接着puts打印

 

    fgets()函數讀到文件結尾會返回一個空指針,代碼可用0代替,或者用NULL  //因為暫時不常見在此不做介紹

 

    在11.8中

# include<stdio.h> # define stlen 10
int main(void) { char words[stlen]; while(fgets(words,stlen,stdin) != NULL&&words[0] != '\n')//不斷循環把stlen-1字符放在數組中加\0,直到最后結尾為\n\0,
 fputs(words,stdout); puts("done."); return 0; }

    輸入字符長度超過 10-1 時仍會全部打印,因為輸入緩沖區的原因,輸入aaaaaaaaabbbbbbbbbccccccccc,字符串會在緩沖區暫時保存,第一次while會將aaaaaaaaa輸出但沒有換行,

第二次時bbbbbbbbb,最后的c結束時會將ccccccccc\n\0儲存打印時會換行。

    儲存換行符有好處也有壞處,想去除換行符,可以在已知的字符串中查找換行符,

     while (words[i] != '\n')

      i++;

   word[i] = '\0';

    如果仍有字符串留在輸入行就用

      

while(getchar() != '\n')//讀取但不儲存輸入,包括\n continue;

    這樣可以清除緩沖區,超過設定長度會將后面的清除,只打印設定長度字符串。

 1 # include<stdio.h>  2 # define stlen 10  3 int main(void)  4 {  5 char words[stlen];  6 int i;  7 while(fgets(words,stlen,stdin) != NULL&&words[0] != '\n')  8  {  9 i = 0; 10 while(words[i] != '\n'&&words[i] != '\0') 11 i++; 12 if(words[i] == '\n') 13 words[i] == '\0'; 14 else //也就是words[0] == '\0'時 15 while(getchar() != '\n') 16 continue; 17 18  puts(words); 19 20  } 21     return 0; 22 }

 

    上述代碼,若輸入apple   則輸出apple

      若輸入aaaaaaaaabbbbbbb  則輸出aaaaaaaaa  因為在輸入后緩沖區是aaaaaaaaabbbbbbb,讀取規定字符數將aaaaaaaaa\0放在words中,后續代碼檢測到\0

     因為getchar()緩沖區的字符b依次被讀取並被丟棄,知道讀取到換行符\n,輸出words     //  \n 也被丟棄。

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM