我們知道着兩個函數都提供每次輸入一行的功能。然而gets是一個不推薦使用的函數,其原因是使用gets不能指定緩沖區的長度,這樣就可能造成緩沖區的溢出。除了gets隻能操作标準輸入(stdin)外,gets和fgets還有另一個差別——gets并不将換行符讀入緩沖區中。例如:輸入”abcde\n”,那麼gets時緩沖區中隻用”abcde”而沒有”\n”。相反fgets則會完整的讀入”abcde\n”。
與此對應,puts因為一般和gets成對使用,是以puts輸出以NULL結尾的字元串後(NULL不輸出),會另外将一個換行符也輸出到标準輸出。
我們先看下面程式段:
程式段1:
char buf[BUFSIZE];
while( fgets(buf,BUFSIZE,stdin)!=NULL )
if( fputs(buf,stdout)==EOF )
printf("output error!\n");
輸出:

結論:fgets和fputs結合使用正常工作
分析:輸入”abcdef\n”,fgets讀入”abcdef\n”到緩沖區,fputs将”abcdef\n”從緩沖區中取出輸出。
程式段2:
char buf[BUFSIZE];
while( gets(buf)!=NULL )
if( puts(buf)==EOF )
結論:gets和puts結合使用正常工作
分析:輸入”abcdef\n”,gets讀入”abcdef”到緩沖區(注:不讀入’\n’),puts将”abcdef”從緩沖區中取出輸出,之後又将一個換行符(‘\n’)輸出到标準輸出,即gets不讀入換行符,而puts增加換行符。
程式段3:
char buf[BUFSIZE];
if( fputs(buf,stdout)==EOF )
結論:gets和fputs結合使用不能正常工作
分析:輸入”abcdef\n”,gets讀入”abcdef”到緩沖區(注:不讀入’\n’),fputs将”abcdef”從緩沖區中取出輸出(并沒有增加換行符),是以下一行的輸入會和上個輸出在同一行,即造成輸出比輸入少一個換行符。
程式段4:
while( fgets(buf,BUFSIZE,stdin)!=NULL )
結論:fgets和puts結合不能正常工作
分析:輸入”abcdef\n”,fgets讀入”abcdef\n”到緩沖區,puts将”abcdef\n”從緩沖區中取出輸出(這裡已經有一個換行符),之後又将一個換行符輸出,是以造成輸出比輸入多一個換行符(輸出兩個換行符)。
總結:應該盡量使用fgets和fputs,一方面是比較安全,兩一方面保持輸入輸出的原樣性,不必去記憶對換行符的處理。