将空终止符附加到 C++ 字符串

rin*_*ng0 1 c++ string protocols null-terminated

为了实现某个协议的客户端需要对特定字符串进行空字节填充,我实现了一个用特定数量的空字节填充字符串的函数:

string padToFill(string s, int fill){
    int len = s.length();
    if (len < fill){
        for (int i = 0; i < fill - len; i++){
            s.append("\0");
        }
    }
    return s;
}
Run Code Online (Sandbox Code Playgroud)

然而,实际上,我从这个函数得到的结果与我作为参数得到的字符串相同。例如padToFill("foo", 5)isfoo和 not foo\0\0。即使 C++ 字符串也应该像处理任何其他字符一样处理空字节

如何实现所需的空填充?

Win*_*ute 11

您使用的重载append接受一个 C 字符串,该字符串以 null 结尾(即:第一个 null 字节标记其结尾)。

这里最简单的方法可能是使用不同的重载append

  s.append(fill - len, '\0');
Run Code Online (Sandbox Code Playgroud)

请注意,这需要 C++20。对于较旧的 C++ 标准,有

   s.resize(fill, '\0');
Run Code Online (Sandbox Code Playgroud)

要不就

   s.resize(fill);
Run Code Online (Sandbox Code Playgroud)

想想看,无论如何,这可能是描述您正在做的事情的更清晰的方式。为了清晰起见,我喜欢这里的第二个选项。