std::stringstr(array.begin(),array.end())是否自行添加空字符?

我对 C++ 很陌生,我想知道是否std::string str(array.begin(), array.end())在字符串的末尾添加了一个空字符?我查了这个参考,但我无法弄清楚。我很感激你的回答!

编辑:我正在使用 C++11 并且我有一个boost::array<u_int8_t>未知的大小。我的目标是之后打印它,str.c_str()因为%s期待一个char*.

str = std::string(arr.begin(),arr.end());
ROS_INFO("Got response: n %s", str.c_str()); 

回答

C++ 标准指定c_str()返回以空字符结尾的字符串(字符串的内容后跟 a '')。根据 C++ 标准版本,您可能会也可能不会保证str[str.size()]也会为您提供''.

这是 C++ 标准指定的唯一内容。是否''最初由其构造函数添加,包括此特定构造函数:这是未指定的。

但是,由于您肯定''会在寻找它时得到最重要的信息,因此这是一个有争议的问题。它会在那里。


回答

由于 C++11std::string必须包含终止空字符。但是, a 中的空字符std::string不一定终止std::string.

我希望通过以下示例能更清楚:

#include <string>
#include <iostream>

int main() {
    std::string x{"Hello World"};

    std::cout << x.c_str() << "n";

    x[5] = '';
    std::cout << x << "n";
    std::cout << x.c_str();
}

印刷:

Hello World
HelloWorld
Hello

我们可以通过获取以空字符结尾的 c 字符串c_str来获得预期的输出。该<<超载知道在哪里停下来,因为有一个空终止符。尽管在中间添加了 a 之后,std::string我们仍然可以使用<<for的重载打印整个字符串std::stringc_str再次调用,将再次返回一个指向 c-string 的指针,其中包含 10 个字符 + 终止,但这次<<重载char*在遇到第一个 时停止,因为这表示 c-string 的结束。

TL;DR:除非您需要从 中获取 c 字符串,否则您不必std::string担心添加空终止符。std::string为你做那个。另一方面,您应该知道std::string不仅在末尾还可以在中间包含空字符。


以上是std::stringstr(array.begin(),array.end())是否自行添加空字符?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>