我們知道著兩個函數都提供每次輸入一行的功能。然而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 )
printf("output error!\n");
輸出:
結論:gets和puts結合使用正常工作
分析:輸入”abcdef\n”,gets讀入”abcdef”到緩沖區(注:不讀入’\n’),puts將”abcdef”從緩沖區中取出輸出,之後又將一個換行符(‘\n’)輸出到標准輸出,即gets不讀入換行符,而puts增加換行符。
程序段3:
char buf[BUFSIZE];
while( gets(buf)!=NULL )
if( fputs(buf,stdout)==EOF )
printf("output error!\n");
輸出:
結論:gets和fputs結合使用不能正常工作
分析:輸入”abcdef\n”,gets讀入”abcdef”到緩沖區(注:不讀入’\n’),fputs將”abcdef”從緩沖區中取出輸出(並沒有增加換行符),所以下一行的輸入會和上個輸出在同一行,即造成輸出比輸入少一個換行符。
程序段4:
char buf[BUFSIZE];
while( fgets(buf,BUFSIZE,stdin)!=NULL )
if( puts(buf)==EOF )
printf("output error!\n");
輸出:
結論:fgets和puts結合不能正常工作
分析:輸入”abcdef\n”,fgets讀入”abcdef\n”到緩沖區,puts將”abcdef\n”從緩沖區中取出輸出(這裡已經有一個換行符),之後又將一個換行符輸出,所以造成輸出比輸入多一個換行符(輸出兩個換行符)。
總結:應該盡量使用fgets和fputs,一方面是比較安全,兩一方面保持輸入輸出的原樣性,不必去記憶對換行符的處理。