为什么我们使用printf()
& {c>中的scanf()
函数?
答案 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。
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所能提供的安全性。