Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有printf的替代方案?_C++_Printf - Fatal编程技术网

C++ 是否有printf的替代方案?

C++ 是否有printf的替代方案?,c++,printf,C++,Printf,如果您#包括,则可以访问printf。我喜欢使用printf,因为它有格式说明符,而且感觉比使用std::cout更好,正如@TonyK善意地解释的那样,snprintf和sprintf用于写入缓冲区,而不是标准流。这不仅仅是回答具体问题,而是解释了一个更广泛的解决方案 对于“更安全”的函数,可以使用snprintf,其中明确指定了对象的大小 在不指定大小和使用printf的情况下,您必须“相信”提供的char*是一个带有终止空字符的有效C字符串,否则printf将继续读取内存 一般来说,如

如果您
#包括
,则可以访问
printf
。我喜欢使用
printf
,因为它有格式说明符,而且感觉比使用
std::cout更好,正如@TonyK善意地解释的那样,
snprintf
sprintf
用于写入缓冲区,而不是标准流。这不仅仅是回答具体问题,而是解释了一个更广泛的解决方案


对于“更安全”的函数,可以使用
snprintf
,其中明确指定了对象的大小

在不指定大小和使用
printf
的情况下,您必须“相信”提供的
char*
是一个带有终止空字符的有效C字符串,否则
printf
将继续读取内存


一般来说,如果要求只使用C并且只依赖于相关的C运行时库(Linux上的glibc,Windows上的msvcrt/ucrt,…),那么只使用C头和使用C编译器是有意义的


如果使用C++是一种选择,使用<代码> STD::CUT是一种自然选择,它将支持显示实现“代码> OsFrase:”运算符< P> GNU C++编译器>代码> G++< /COD>编译时检查代码> Prtff< /C>参数。如果在命令行上指定

-Wall
,则如果检测到不匹配,将发出警告。因此,如果您正在使用此编译器,则可以使用
printf
,而无需担心

您的编译器可能提供也可能不提供类似的服务。但无论如何,还是要使用
printf
,至少要优先使用可笑的
cout
机制。或者对于类型安全的解决方案,您可以考虑使用.< /P>

<强>编辑添加:有一个讨论,您可能会发现有趣的。

流输出(使用派生类的<代码> STD::流< /C> >)是在C++中输出的常见和推荐的方式。可以使用
中提供的流操纵器进行格式化。否认这可能会导致对抗风力发电厂…;-)不过,使用
std::cout
进行输出格式化可能会带来相当大的麻烦。QT的QString具有类似的类型安全函数。好吧,我不会仅仅为了这个目的而介绍QT,但是如果你正在使用它。。。您也可以基于可变模板编写自己的
printf
函数。但是,您可以省略特定的类型标识符(d、u、x等)。根据您使用的编译器,
printf
在实践中是类型安全的,因为许多编译器可以解析和检查格式字符串。我的建议是忽略iostreams;它们是一团糟。通常可以在C++中使用<代码> STDIO < /Cord>头文件。虽然 IoSturi>代码>是一般的C++工作,但有许多实例,其中代码> STDIO < /C>函数可以是一种更有效的方法,也可以注意到,在某些情况下,甚至不允许使用<代码> Prtff。如果你正在寻找一些替代方案,你也可以考虑。你不喜欢那些不解释答案错误的下层选民,那么有帮助。(顺便说一句,我想这是因为您的答案没有解决OPs问题的核心问题(变量参数的类型安全性),而且因为printf和snprintf做了非常不同的事情(一个写入标准输出,另一个写入字符数组))。
printf
snprintf
一样安全。
snprintf
函数用于防止
sprintf
(而不是
printf
)易受攻击的缓冲区溢出错误。@Chipster:你看过我的评论了吗?还是你只是不相信?@TonyK感谢你的帮助澄清,我编辑了我的原始帖子以使事情变得明确。@Chipster感谢你的支持。也就是说,虽然我的帖子只是提供信息,但它并没有明确回答所问的问题。