SNPrTNF C++替代方案 如何将此代码从C转换为C++? char out[61]; //null terminator for (i = 0; i < 20; i++) { snprintf(out+i*3, 4, "%02x ", obuf[i]) }

SNPrTNF C++替代方案 如何将此代码从C转换为C++? char out[61]; //null terminator for (i = 0; i < 20; i++) { snprintf(out+i*3, 4, "%02x ", obuf[i]) },c++,c++11,printf,string-formatting,C++,C++11,Printf,String Formatting,我找不到snprintf的任何替代方案。请从中使用stringstream类 例如: 包括 包括 包括 包括 使用名称空间std; int main { 细流ss; 对于int i=0;i可以用标准库的STD::StristFiels+IOMANIP/O流操作器:C/C++轻松地将此代码转换成C++: 包括 包括 ... std::奥斯汀溪流; Frase可以用标准库的STD::StristFiels+IOMANIP I/O流操作器将代码从C转换为C++, 包括 包括 ... std::奥斯汀溪

我找不到snprintf的任何替代方案。

请从中使用stringstream类

例如:

包括 包括 包括 包括 使用名称空间std; int main { 细流ss; 对于int i=0;i<20;i++{ ss使用来自的stringstream类

例如:

包括 包括 包括 包括 使用名称空间std; int main { 细流ss; 对于int i=0;i<20;i++{ ss您可以使用

你可以用


如果您有include并键入std::snprintf或使用命名空间std;,则此代码是有效的C++11


无需修复未损坏的内容。

如果您有include并键入std::snprintf或使用命名空间std;,则此代码是有效的C++11


不需要修复什么是不被破坏的。< /P> < P>可以用标准库的STD::StristFiels+IOMANIP/O流操作器:C/C++轻松地将此代码转换成C++:

包括 包括 ... std::奥斯汀溪流;
Frase

可以用标准库的STD::StristFiels+IOMANIP I/O流操作器将代码从C转换为C++,

包括 包括 ... std::奥斯汀溪流;
stream您考虑过sprintf吗?如果您合理地确定没有用户提供的数据会溢出缓冲区,我就不会为更安全的版本而烦恼了。也就是说,您的字符串有固定的布局,您只需要提取低半字节和高半字节x&15,x>>4,然后将它们格式化为十六进制0123456789abcdef[nibble]并将它们存储在正确的位置。提供一个需要解析的格式字符串以格式化另一个字符串有点难看……还有一点需要注意的是:如果您尝试了明显的和使用过的stringstreams,它失败的原因是它会考虑每个字符,即使它的typedefd为byte或uint8不是字母,所以您必须对其进行静态转换。Possi重复@UlrichEckhardt,我建议总是使用snprintf而不是sprintf。使用sprintf可能非常危险,而且没有任何好处,所以请使用更安全的snprintf。我所追踪到的一些最难的bug来自使用缓冲区太小的sprintf的人。也就是说,snprintf的OP用法与da一样不可靠。如果out[]的大小发生变化或his for循环使用另一个任意长度而不是20,snprintf将无法有效阻止out[]之外的内存值得庆幸的是,迁移到stringstream将导致更安全的代码。不使用它的唯一原因是它不存在,但这些实现应该是过去的事情。顺便说一句:61、20、3都是神奇的数字,使此代码变得脆弱,因为您必须一起调整至少两个,然后导致Craig描述的场景,如果你忘记了一个。你考虑过sprintf吗?如果你合理地确定没有用户提供的数据会溢出缓冲区,我就不会为更安全的版本费心了。也就是说,你的字符串有一个固定的布局,你只需要提取低半字节和高半字节x&15,x>>4,然后将它们格式化为十六进制0123456789abcdef[nibble]并将它们存储在正确的位置。提供一个需要解析的格式字符串以格式化另一个字符串有点难看……还有一点需要注意的是:如果您尝试了明显的和使用过的stringstreams,它失败的原因是它会考虑每个字符,即使它的typedefd为byte或uint8不是字母,所以您必须对其进行静态转换。Possi重复@UlrichEckhardt,我建议总是使用snprintf而不是sprintf。使用sprintf可能非常危险,而且没有任何好处,所以请使用更安全的snprintf。我所追踪到的一些最难的bug来自使用缓冲区太小的sprintf的人。也就是说,snprintf的OP用法与da一样不可靠。如果out[]的大小发生变化或his for循环使用另一个任意长度而不是20,snprintf将无法有效阻止out[]之外的内存值得庆幸的是,迁移到stringstream将导致更安全的代码。不使用它的唯一原因是它不存在,但这些实现应该是过去的事情。顺便说一句:61、20、3都是神奇的数字,使此代码变得脆弱,因为您必须一起调整至少两个,然后导致Craig描述的场景,如果你忘记了一个。OP没有问如何使用Boost。没有它很容易做到。OP没有问如何使用Boost。没有它很容易做到。使用stringstreams,然后通过printf输出,真的吗?难道没有operator@UlrichEckhardt你是什么意思?有第三个alterna吗tive?使用stringstreams,然后通过printf输出,真的吗?难道还有operator@UlrichEckhardt你是什么意思?有第三种选择吗?
#include <boost/format.hpp>
#include <string>

std::string out;
for (size_t i=0; i<20; ++i)
    out += (boost::format("%02x") % int(obuf[i])).str();