1. 程式人生 > 其它 >字串輸入與輸出

字串輸入與輸出

1.gets( )函式(和puts())

gets( )函式簡單易用,它讀取整行輸入,直至遇到換行符,然後丟掉換行符,儲存其餘字元,並在這些字元的末尾新增一個空字元使其成為字串。它經常和puts( )函式配對使用,該函式用於顯示字串,並在這些字元的末尾新增換行符。

但是,gets( )函式只知道陣列的開始處,並不知道陣列中有多少個元素。如果輸入的字串過長,會導致緩衝區溢位,即多餘的字元超出了指定的目標空間。如果多餘的字元只是佔用了未被使用的記憶體,就不會立即出現問題;如果他們擦寫掉程式中的其他資料,會導致程式異常終止,或者還有其他情況。所以很多人都在建議拋棄gets( )函式。

gets( )的替代品gets_s( ),它是stdio.h輸入輸出函式系列中的可選擴充套件,所以支撐C11的編譯器也不一定支撐它。

2.fgets( )函式(和fputs( ))

fgets()函式通過第二個引數限制讀入的字元數來解決溢位的問題。該函式專門設計用於處理檔案輸入,所以一般情況可能不太好用。fgets()和fgets()的區別如下。

  • fgets()函式的第2個引數指明瞭讀入字元的最大數量。如果該引數數的值是N,那麼fgets()將讀入N-1個字元,或者遇到第一個換行符為止。
  • 如果fgets()讀到一個換行符,會把它儲存在字串中。這點與gets()不同,gets()會丟棄掉換行符。
  • fgets()函式的第3個引數指明要讀入的檔案。如果讀入從鍵盤輸入的資料,則以stdin(標準輸入)作為引數,該標識定義在stdio.h中。

注意:fgets()函式返回指向char的指標。如果一切順利的話,該函式返回的地址與傳入的第1個引數相同。但是,如果函式讀到檔案結尾,它將返回一個特殊的指標:空指標。該指標保證不會指向有效的資料,所以可用於標識這種特殊情況。在程式碼中,可以用數字0來代替,不過在C語言中用巨集NULL來代替更常見。

#include <stdio.h>
int main()
{
  char word[10];
  while(fgets(word,10,stdin)!=NULL&&word[0]!='\n')
    fputs(word,stdout);
}

如以上程式碼,雖然fgets只讀入9個字元,但是該程式似乎在處理過長的輸入時完全沒有問題。

系統使用緩衝的I/O。這意味著使用者在按下Return鍵之前,輸入都被儲存在臨時儲存區(緩衝區)中。按下Return鍵就在輸入中增加一個換行鍵,並把整行輸入傳送給fgets()。對於輸入,fputs()把字元傳送給另一個緩衝區,但傳送換行符時,緩衝區中的內容被髮送至螢幕上。

2.gets_s函式

gets_s()與fgets()的區別如下

  • gets_s()只從標準輸入中讀取資料,所以不需要第3個引數。
  • 如果gets_s()讀到換行符,會丟棄它而不是儲存它。
  • 如果gets_s()讀到最大字元數都沒有讀到換行符,會執行以下幾步。首先把目標陣列中的首字元設定為空字元,讀取並丟棄隨後的輸入直至讀到換行符或檔案結尾,然後返回空指標。接著呼叫依賴實現的“處理函式”(或者你選擇的其他函式),可能會終止或退出程式。

3.puts()

  • puts()函式很容易使用,只需把字串的地址作為引數轉遞給它即可。
  • puts()在顯示字串時會自動在末尾新增一個換行符。
  • puts()再遇到空字元時停止輸出,所以必須確保有空字元。

4.fputs()

fputs()函式是puts()針對檔案定製的版本,他們的區別如下。

  • fputs()函式的第2個引數指明要寫入資料的檔案。如果要列印在顯示器上,可以用定義在stdio.h中的stdout作為引數。
  • 與puts()不同,fputs()不會在輸出的末尾新增換行符。