標籤:

C++中是否應避免使用C語言函數?

例如,有時能看到諸如 "C++為什麼不提倡使用scanf和printf函數的說法"的文章,

而自己在寫C++的時候往往混用.

printf("(%d),(%d),(%d)
",x,y,z) ;

寫成

cout&<&<"("&<&

也太難看了,如何解決此類問題.

(知乎新人,正在學習如何提一個好問題)


第一種寫法:

cout &<&< "(" &<&< x &<&< ")," &<&< "(" &<&< y &<&< ")," &<&< "(" &<&< z &<&< ")" &<&< endl;

第二種寫法:

//由於題目中使用了 %d ,所以假定類型為 int
vector& output = {x, y, z};
bool first_element = true;

for (auto target : output) //C++11
{
if (first_element)
first_element = false;
else
cout &<&< ","; cout &<&< "(" &<&< target &<&< ")"; } cout &<&< endl;

第三種寫法(C++11):

template&
void print(T target)
{
cout &<&< "(" &<&< target &<&< ")" &<&< endl; } template&
void print(T target, Tpack... targets)
{
cout &<&< "(" &<&< target &<&< "),"; print(targets...); } int main() { print(x, y, z); }


C函數能不用盡量不用。

對於你題中的問題可以試試 fmtlib 。


printf的缺點比較難看出來,但是scanf的缺點就很明顯。在用戶輸入什麼都是自由的情況下,你調用了scanf,怎麼報告他輸入的語法錯誤的具體類型和位置?istream做這個就很簡單。


我覺得 cout 挺好的,而且遠比 printf 靈活。


是的,C++使用時除非實在沒有替代品(例如exit函數)否則一定避免使用C。例如不用sprintf而用stringstream。

但是有一個例外,就是你對效率要求很高時,還是C函數快。


就本問題而言,boost::format 已經是好答案。

scanf 和 printf 是特例,不要推廣。不定參數的C函數並不多。

建議去看看 GCC 中 STL。應該知道,STL 下面是大把的C調用。

非要一個通用答案的話,那好:

1、儘可能工作在最高的抽象層上。能用 shell script 解決的問題不要動用編程語言,哪怕是 python。同理,能用 STL 的時候不用 C 函數。

2、確有需求的時候不要忌諱任何編程語言,哪怕是C和彙編。當你只有一個8M主頻1K內存的51,你的選擇很有限。

3、任何庫,哪怕是標準庫、POSIX庫,都是用來解決問題而不是用來為難你的。難到無法快速(以年度計算)解決的問題,要麼已經有人解決等你用 google 或 stackoverflow 去發現他們,要麼不該是你的工作——除非老闆給你漲薪水。

4、軟體總比硬體貴。51單片機運行不了的庫,換STM;STM運行不了的庫,換ARM9+;再運行不了的庫,換INTELAMD。再不行就讓老闆申請863用銀河天河太湖吧。總之,不要為省下10K軟妹幣的硬體,你花上半年加班。


具體怎麼用要看自己的需求。

我們寫代碼不是符合標準了就能給你100分。

輸出一個數當然是cout好,但如果printf("%3x,%4d,%5.6f",…)你用cout豈不是累死?


不需要避免。

實際上,字元串的格式模板有其自己獨到的優勢,比如格式可以是運行時生成的。


boost::format

#include

#include

using namespace std;

int main( ) {

cout }


作為剛學一年半計算機的編程小白斗膽答一下…大神們輕踩…

如果只考慮輸入輸出這一塊的話,基本區別不大。但:

1.c的io函數時間上要比c++的cin/cout快很多,有些編程題目用cin/cout會超時。

2.scanf的其中一個缺陷是不限制讀入字元串的長度,有可能造成緩衝區溢出攻擊。如果重視安全性的話,建議盡量避免使用。

3.cin包裝有一些庫函數,可以降低代碼量。//但有時候確實c的風格更美觀和簡潔…


沒有必要可以避免吧,除非發現特別不利的影響,比如影響了程序的效率。

我不是專業程序員,所以一貫在c++中寫入一些c函數的。

就從你的舉例來說,printf的可讀性確實要好一些。


那個好用用那個

為啥非要用不好用的折磨自己呢?


盡量使用c++標準庫的類操作字元串,格式化輸入輸出,文件讀寫等等,能用stl的別用c語言庫函數,別在乎那點性能損耗,程序穩定bug少要重要得多


不需要避免函數調用,應該避免的是編程範式。


其實我想知道malloc相關的C函數怎麼優雅地用new替代


我覺得有個主要問題是printf是線程不安全的。所以在c++養成好習慣還是不要用比較好。


如果用cout那麼如何指定保留幾位小數,有效數字位數等參數呢?

用哪個函數還得看具體問題哪個介面設計的好。我用printf就感覺挺好用的,連java都有類似的String.format函數。


推薦閱讀:

C++中循環中的auto是利用了迭代器的機制嗎?
C/C++中char/int/long等基本內置類型為何要編譯器相關而不是固定長度?
C++函數內的靜態變數初始化以及線程安全問題?
英文水平到什麼程度,學習C++ primer英文版比中文版好?
函數是指針吧?函數在內存中是怎樣儲存的

TAG:C編程語言 | C |