C++ 是否使用\0填充字符串格式?
似乎sprintf和Boost.Format都使用空格填充:C++ 是否使用\0填充字符串格式?,c++,boost,C++,Boost,似乎sprintf和Boost.Format都使用空格填充: boost::format fmt("%012s"); fmt % "123"; std::string s3 = fmt.str(); 有没有办法用“\0”填充?问题被标记为。虽然OP提到了SpaFrF和Booost,但不是C++的输出流运算符。这让我有点惊讶 虽然我怀疑OP的网络协议中是否真的需要/需要使用C++输出运算符和 IOMANIP < /代码>它变得相当容易。 示例代码: #include <iostream&g
boost::format fmt("%012s");
fmt % "123";
std::string s3 = fmt.str();
有没有办法用“\0”填充?问题被标记为。虽然OP提到了SpaFrF和Booost,但不是C++的输出流运算符。这让我有点惊讶
虽然我怀疑OP的网络协议中是否真的需要/需要使用C++输出运算符和<代码> IOMANIP < /代码>它变得相当容易。
示例代码:
#include <iostream>
#include <iomanip>
#include <sstream>
int main()
{
std::ostringstream out;
out << std::setw(10) << std::setfill('\0') << 123;
const std::string dump = out.str();
std::cout << "length of dump: " << dump.size() << '\n';
for (char c : dump) {
std::cout << ' ' << std::setw(2) << std::setfill('0')
<< std::setbase(16) << (unsigned)(unsigned char)c;
}
// done
return 0;
}
由于'\0'
是一个不可打印的字符,我将输出转换为std::ostringstream
,将输出检索为std::string
,并将单个字符打印为十六进制代码:
导致10个字符的右对齐std::setw(10)
导致使用std::setfill('\0')
字节填充'\0'
是为输出给定的313233
常量的ASCII码123
我忽略了OP想要格式化字符串(而不是数字)的事实。但是,它也适用于字符串: 格式:
out << std::setw(10) << std::setfill('\0') << "abc";
我可以问一下为什么要使用
\0
?这是网络协议所要求的。我认为这没有任何功能。您应该编写自己的函数来实现这一点。如果只搜索一点,就有许多填充字符串的示例。如果你想自己尝试一下,这两种方法都不难做到。如果你正在为特定的网络协议编码,你应该以一种比使用字符串函数填充更低级的方式来完成。@user1633272我意识到你想要格式化字符串(而不是int
)。然而,它的工作原理是一样的。输出流可以做到这一点,对于不同格式的单个格式来说,它并不灵活。@ IUR1633、227、IHO、C++流格式与I/O操作器至少是灵活的,如<代码> Primff()/Cuth>家族,但可能更多。(std::setfill()
就是一个例子。我相信在printf()
中没有类似的内容,只有在'
和'0'
之间选择填充字符。)