C++ 是否使用\0填充字符串格式?

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

似乎sprintf和Boost.Format都使用空格填充:

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
,并将单个字符打印为十六进制代码:

  • std::setw(10)
    导致10个字符的右对齐
  • std::setfill('\0')
    导致使用
    '\0'
    字节填充
  • 313233
    是为输出给定的
    123
    常量的ASCII码

我忽略了OP想要格式化字符串(而不是数字)的事实。但是,它也适用于字符串:

格式:

out << std::setw(10) << std::setfill('\0') << "abc";

我可以问一下为什么要使用
\0
?这是网络协议所要求的。我认为这没有任何功能。您应该编写自己的函数来实现这一点。如果只搜索一点,就有许多填充字符串的示例。如果你想自己尝试一下,这两种方法都不难做到。如果你正在为特定的网络协议编码,你应该以一种比使用字符串函数填充更低级的方式来完成。@user1633272我意识到你想要格式化字符串(而不是
int
)。然而,它的工作原理是一样的。输出流可以做到这一点,对于不同格式的单个格式来说,它并不灵活。@ IUR1633、227、IHO、C++流格式与I/O操作器至少是灵活的,如<代码> Primff()/Cuth>家族,但可能更多。(
std::setfill()
就是一个例子。我相信在
printf()
中没有类似的内容,只有在
'
'0'
之间选择填充字符。)