为什么我们在C ++中使用printf()函数?

时间:2010-11-02 11:02:39

标签: c++

为什么我们使用printf()& {c>中的scanf()函数?

9 个答案:

答案 0 :(得分:16)

我认为一些程序员发现它们比C ++中更常见的基于流的程序员更容易或更容易访问。

此外,在进行复杂的字符串格式化时,使用格式化字符串的C方式可以被视为更简洁和可读。我并不是说它,我只是说在某些情况下有些人可能认为它是,因此选择使用printf()

答案 1 :(得分:14)

我读过关于<stdio.h><iostream>的优点和缺点的各种争论。但对我来说,这个问题超出了合理的怀疑。除了琐碎的测试目的, 永远不会 在C ++中使用stdio.h

如果这听起来太极端,请考虑stdio.h是C程序中主要安全漏洞的原因。将“unsanitized”格式字符串传递给Xprintf函数与从不受信任的客户端执行未经过验证的SQL查询一样危险。

假设某人通过了以下字符串:

"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"

...并且您的程序天真地将此字符串传递给printf

您认为会发生什么?在那个例子中,你可能很幸运,你的程序就会崩溃。但是熟练的黑客可以使用%n格式说明符写入任意内存地址,例如堆栈上的返回地址,使他/她能够执行注入的shellcode。

但是,C ++ IOstream没有任何这些问题,因为格式参数不是在运行时解释的,而是在编译时计算的。因此,尽管C ++ iostream的额外冗长,你应该总是在生产代码中优先于printf

答案 2 :(得分:7)

因为在我看来,这是比格式化字符串更好的方式。 我可以使用C-like格式化函数来完成字符串格式化,例如浮点变量的精度以及更少的代码。

答案 3 :(得分:6)

我不确定这里的问题是什么。

默认情况下,应该使用<iostream>功能(std::cin等)。

然而,有一种观点认为,使用printf格式化输出而不是std::cout会导致代码更简洁(因为您通过单个格式字符串控制它,而不是流链当然,printf的类型安全性要小得多,而且不以任何方式面向对象(与iostream相反,iostream可以在用户定义上重载operator<<operator>>用于封装格式化输出的许多方面的类型。

答案 4 :(得分:4)

快速而简洁。我们非常高兴地将它用于我们的日志记录。

(我们也支持ostream风格,但通常printf在那里获胜......)

答案 5 :(得分:4)

我不使用printf。我通常使用cout,然后我自己哭了以后睡觉。

说真的,两种选择都很糟糕。 printf具有良好的语法,但抛弃了类型安全性,可扩展性和安全性。并且cout对于i18n来说很糟糕,并且使用起来很冗长和痛苦。

boost::format是两者之间相当不错的妥协。如果您有选择,请改用它。

答案 6 :(得分:2)

一个重要原因是速度。 但最重要的原因只是一种习惯。 流的主要优点是它们是可继承的,因此它们更适合OO范例。

答案 7 :(得分:0)

处理IO的C ++方法是使用IO-streams

答案 8 :(得分:0)

你应该使用iostreams,因为printf / scanf是不可扩展的。您无法向printf或scanf添加新的格式说明符。但是,您可以从iostream中提取任何具有合适运算符的类型T.此外,这些类型在编译时已知,这一事实远远超出了printf和scanf所能提供的安全性。