fputs函數,C語言fputs函數及其用法詳解

2020-07-16 10:04:22
fputs() 函數也是用來顯示字串的,它的原型是:

# include <stdio.h>
int fputs(const char *s, FILE *stream);

s 代表要輸出的字串的首地址,可以是字元陣列名或字元指標變數名。

stream 表示向何種流中輸出,可以是標準輸出流 stdout,也可以是檔案流。標準輸出流即螢幕輸出,printf 其實也是向標準輸出流中輸出的。

fputs() 和 puts() 有兩個小區別:
  1. puts() 只能向標準輸出流輸出,而 fputs() 可以向任何流輸出。
  2. 使用 puts() 時,系統會在自動在其後新增換行符;而使用 fputs() 時,系統不會自動新增換行符。

那麼這是不是意味著使用 fputs() 時就要在後面新增一句“printf("n");”換行呢?看情況!如果輸入時使用的是 gets(),那麼就要新增 printf 換行;但如果輸入時用的是 fgets(),則不需要。

因為使用 gets() 時,gets() 會將回車讀取出來並丟棄,所以換行符不會像 scanf 那樣被保留在緩衝區,也不會被 gets() 儲存;而使用 fgets() 時,換行符會被 fgets() 讀出來並儲存在字元陣列的最後,這樣當這個字元陣列被輸出時換行符就會被輸出並自動換行。

但是也有例外,比如使用 fgets() 時指定了讀取的長度,如唯讀取 5 個字元,事實上它只能儲存 4 個字元,因為最後還要留一個空間給 '',而你卻從鍵盤輸入了多於 4 個字元,那麼此時“敲”回車後換行符就不會被 fgets() 儲存。資料都沒有地方存放,哪有地方存放換行符呢!此時因為 fgets() 沒有儲存換行符,所以就不會換行了。

下面寫一個程式驗證一下:
# include <stdio.h>
int main(void)
{
    char str[20];  /*定義一個最大長度為19, 末尾是''的字元陣列來儲存字串*/
    printf("請輸入一個字串:");
    fgets(str, 19, stdin);  /*從輸入流stdin中讀取19個字元到字元陣列str中*/
    fputs(str, stdout);  //將字元陣列的內容輸出到輸出流stdout中
    return 0;
}
輸出結果是:
請輸入一個字串:i love you
i love you
Press any key to continue

我們看到讀取 19 個字元足夠儲存“i love you”,所以 fgets() 最後會儲存換行符。這樣 fputs() 輸出時這個換行符就能換行了。

下面再將讀取的字元改小一點看看:
# include <stdio.h>
int main(void)
{
    char str[20];  /*定義一個最大長度為19, 末尾是''的字元陣列來儲存字串*/
    printf("請輸入一個字串:");
    fgets(str, 5, stdin);  //從輸入流stdin中讀取4個字元到字元陣列str中
    fputs(str, stdout);  //將字元陣列的內容輸出到輸出流stdout中
    return 0;
}
輸出結果是:
請輸入一個字串:i love you
i loPress any key to continue

我們看到並沒有換行。

值得說明的是,雖然 gets()、fgets()、puts()、fputs() 都是字串處理常式,但它們都包含在 stdio.h 標頭檔案中,並不是包含在 string.h 標頭檔案中。