为什么在C+;中使用printf()函数+;? 为什么我们在C++中使用 >代码> >代码> SCANFER()/Cuth>函数? 我可以使用 C类< /COD>格式化函数,用浮点变量的精度来做字符串格式,而且代码更少。 < P>处理IO的C++方法。 < P>我认为有些程序员比在C++中更常见的流式更容易或更容易访问。

为什么在C+;中使用printf()函数+;? 为什么我们在C++中使用 >代码> >代码> SCANFER()/Cuth>函数? 我可以使用 C类< /COD>格式化函数,用浮点变量的精度来做字符串格式,而且代码更少。 < P>处理IO的C++方法。 < P>我认为有些程序员比在C++中更常见的流式更容易或更容易访问。,c++,C++,此外,在进行复杂的字符串格式化时,可以认为使用格式化字符串的C方式更简洁易读。我不是说它是,我只是说,在某些情况下,有些人可能会认为它是,因此选择使用printf()我不确定这里的问题是什么 默认情况下,可能应该使用功能(std::cin等) 然而,有一种观点认为,对格式化输出使用printf而不是std::cout会减少代码的详细程度(因为您可以通过单个格式字符串而不是流修饰符链来控制代码)。当然,printf的类型安全性要低得多,而且在任何方面都不是面向对象的(与iostreams不同,io

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

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

默认情况下,可能应该使用
功能(
std::cin
等)


然而,有一种观点认为,对格式化输出使用
printf
而不是
std::cout
会减少代码的详细程度(因为您可以通过单个格式字符串而不是流修饰符链来控制代码)。当然,
printf
的类型安全性要低得多,而且在任何方面都不是面向对象的(与iostreams不同,iostreams可以在用户定义的类型上重载
操作符
,以封装格式化输出的许多方面)。

一个重要原因是速度。 但最重要的原因只是一种习惯。
流的主要优点是它们是可继承的,因此它们更好地使用OO范式。

我读过关于
的优劣的各种辩论。但对我来说,这个问题已经解决了,没有合理的怀疑。除了琐碎的测试目的,永远不要使用
stdio.h > C++ > 

如果这听起来太极端,请考虑<代码> STDIO .H./<代码>是C程序中主要安全漏洞的原因。将“未消毒”的格式字符串传递给XPROTF函数与执行不受信任的客户端的未经消毒的SQL查询一样危险。 假设有人向您传递以下字符串:

"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
…而您的程序会天真地将此字符串传递给
printf

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


C++的IOFSUM,没有任何这些问题,因为格式参数在运行时不被解释,而是在编译时被评估。因此,尽管C++的IOFROTS额外冗长,但是在生产代码中应该总是优于代码> PROTFF <代码>。非常高兴


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

我不使用
printf
。我通常使用
cout
,然后我哭着睡觉

说真的,这两个选项都很糟糕。
printf
的语法很好,但却丢掉了类型安全性、可扩展性和安全性。
cout
对于i18n来说很糟糕,而且使用起来又冗长又痛苦


boost::format
在两者之间是一个相当不错的折衷方案。如果您有选择,请改用它。

您应该使用iostreams,因为printf/scanf是不可扩展的。您不能向printf或scanf添加新的格式说明符。但是,您可以从iostream中提取任何具有合适运算符的类型t。此外编译时已知类型这一事实是一个远远领先于printf和scanf的安全军团。

我们不知道(填满空间)。仅仅因为你可以…@Svisstack:IMHO,除非答案真的解决了你的问题(一种或另一种方式),否则你不应该接受答案.不幸的是,录取率系统让这个想法有些可笑…@罗杰:我承认我没有检查那里的封闭式问题,所以我把它读为10分之0。我的错。我读了他的一些问题的答案,我认为其中很多问题都值得接受。如果他认为答案遗漏了什么或不完整Y清楚,他可能会添加一些评论来询问缺少的细节。更简单的格式化是为什么Boost拥有自己的字符串格式化库,它依赖经典的C语法。有不少“学习C++只使用最小努力”的样式书至少用于教IOFSUTF上的Prtff/ScNF。C++、 CSTDIO 的实现也可能稍快。我在旧C++实现中工作,其中STDIO比IOFSWORD快得多。+我更喜欢<代码> Prtff<代码>所有的<代码>这些函数也是C++。TY,所以它们不应该用在C++代码中。如果这是错误的,请纠正我。@空间:误解和流行重复。每个都有优势;使用手头的工作工具。“罗杰:我认为C++不提供一个很大的冗余库(<代码> IoSoS)只是为了傻笑。C++不禁止任何旧的C标题,但它们只包含在C++中,以保持向后兼容性。不应该使用<代码> Prtff< /C>和CONSORE。如果没有其他原因,那么仅仅是因为它们不可扩展,不能用于自定义对象。C++使用IO流或,如果您不喜欢他们的界面(谁喜欢?),请使用Boost.Format。@罗杰:我认为这是有意义的。这是一种更经济实惠的升级方式,可以更改一个include,并使用namespace添加
指令,而不是重写库的每个用法以符合不同的I