Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux教程 >> fgets、gets與fputs、puts

fgets、gets與fputs、puts

日期:2017/2/7 14:32:27      編輯:Linux教程
 

 我們知道著兩個函數都提供每次輸入一行的功能。然而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,一方面是比較安全,兩一方面保持輸入輸出的原樣性,不必去記憶對換行符的處理。

Copyright © Windows教程網 All Rights Reserved