字符串輸入與輸出


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()不會在輸出的末尾添加換行符。

 

提醒:

char *word;
while(*word)     //與*word!='\0'相同

if(word)        //與word!=NULL相同,NULL即讀到文件結尾或出現讀取錯誤


免責聲明!

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



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