unw*_*ind 16
我认为一些程序员发现它们比C++中更常见的基于流的程序员更容易或更容易访问.
此外,在进行复杂的字符串格式化时,使用格式化字符串的C方式可以被视为更简洁和可读.我不认为它是,我只是说,在某些情况下,有些人可能会认为这是,因此选择使用printf().
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>功能(std::cin等).
然而,有一个论点是,使用printf格式化输出而不是std::cout导致更简洁的代码(因为你通过单个格式字符串控制它,而不是流修饰符链.当然,printf类型安全性要小得多,并且不以任何方式面向对象(与iostream相比,可以重载operator<<并operator>>在用户定义的类型上封装格式化输出的许多方面).