fputs() 函數也是用來顯示字串的,它的原型是:
# include <stdio.h>
int fputs(const char *s, FILE *stream);
s 代表要輸出的字串的首地址,可以是字元陣列名或字元指標變數名。
stream 表示向何種流中輸出,可以是標準輸出流 stdout,也可以是檔案流。標準輸出流即螢幕輸出,printf 其實也是向標準輸出流中輸出的。
fputs() 和 puts() 有兩個小區別:
-
puts() 只能向標準輸出流輸出,而 fputs() 可以向任何流輸出。
-
使用 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 標頭檔案中。