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

ank*_*kit 4 c++

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

unw*_*ind 16

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

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

  • 更简单的格式化是Boost拥有自己的字符串格式库的原因,它依赖于经典的C语法. (6认同)
  • ++我更喜欢`printf`而不是所有```的东西,但我从来没有太多使用`scanf`. (2认同)

Cha*_*via 14

我已经阅读了关于<stdio.h>对比的美德和恶习的各种争论<iostream>.但对我来说,这个问题超出了合理的怀疑.除了琐碎的测试目的,永远不要stdio.h在C++中使用.

如果这听起来太极端,请考虑这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"
Run Code Online (Sandbox Code Playgroud)

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

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

但是,C++ IOstream没有任何这些问题,因为格式参数不会在运行时解释,而是在编译时进行评估.因此,尽管C++ iostream的额外冗长,你应该总是更喜欢它们printf在生产代码中.

  • 不同意"永远".在很多情况下,iostream的详细程度都没有给你带来任何好处,只会混淆你的代码.你给出了一个不是这种情况的例子,并不意味着它必须适用于所有情况! (6认同)
  • 我认为将未经过处理的用户输入传递给任何函数是危险的,这与使用任何和所有函数不同. (6认同)
  • +1表示安全问题和示例 (2认同)

Svi*_*ack 7

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


Oli*_*rth 6

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

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

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

  • "OO"与"good"不同,但你当然可以编写好的OO代码.否则为+1分. (4认同)