2014-02-25 49 views
1

我的問題是關於獲取()和放置()技術上用於字符串的聲音?

gets() 

puts() 

是他們爲字符串輸入和輸出完美的解決方案?

+2

如果用「完美」表示「成熟並有緩衝區溢出的機會」('gets')。 –

+1

如果你想在你的輸出中添加一個換行符,'puts()'很好;如果你不這樣做,請改用'fputs()'。就'gets()'而言,假設它從來不存在。它不能在惡劣的環境中安全使用 - 你應該假設你的程序在惡劣的環境中工作。 –

回答

3

對於gets,請參見手冊頁:

BUGS

切勿使用gets()。因爲不知道 的數據是不可能知道的,所以有多少個字符gets()將會讀取,並且因爲gets()將繼續存儲 字符超過緩衝區的末尾,所以使用是非常危險的。它已被用來破壞計算機安全。改爲使用fgets()

puts是好的,如果你只是想寫一個字符串到stdout

6

gets在C99中被標記爲過時,並且由於該函數的安全問題而在C11中被刪除。請勿使用它,請改爲使用fgets。作爲歷史記錄,gets被第一個大規模互聯網蠕蟲利用(被指責):1988年inet蠕蟲病毒。

puts功能是確定的,如果它適合您的需求。

4

gets()在一個非常可怕的方式是從根本上不安全:它將寫入無限數量的字符到它的參數,溢出它提供的任何緩衝區。因此,它永遠不會被使用。如果您使用它,許多較新的編譯器將發出自動警告。相反,使用fgets(),這需要一個長度參數:

char buf[...]; 
fgets(buf, sizeof(buf), stdin); 

在另一方面,puts()是完全罰款。它相當於printf("%s\n", x);,有些編譯器實際上會將某些常數printf()調用轉換爲puts()作爲標準優化。去野外。

相關問題