vector c++末尾的垃圾< char>

sczxawaw  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(121)

我有一个有趣的问题。初始化我的向量后,我看到数据后面有一些垃圾。下面是我的调试器显示的内容:

下面是我如何初始化我的vector:

std::vector<char> responsebuf {'1'};

当我尝试使用responsebuf.data()输出缓冲区的内容时,出现了问题:

std::cout << responsebuf.data();

我怎样才能输出数据而不得到这些垃圾字节呢?

lokaqttq

lokaqttq1#

vector可能已经分配了也可能没有分配超过其初始大小的额外内存。无论哪种方式,都不允许访问该内存。这样做是未定义的行为。它并不是内存中存在太多“垃圾”,而是更像是“不关程序的事”。
由于你显然希望你的vector的内容表现得像以NULL结尾的字符串,你有几个选择:
1.在构造时显式终止:

std::vector<char> responsebuf {'1', '\0'};
std::cout << responsebuf.data();

1.稍后追加一个NUL字符:

std::vector<char> responsebuf {'1'};
responsebuf.push_back('\0');
std::cout << responsebuf.data();

1.使用string_view

std::vector<char> responsebuf {'1'};
std::cout << std::string_view(responsebuf.data(), responsebuf.size());

1.使用ostream_iterator

std::vector<char> responsebuf {'1'};
std::copy(responsebuf.begin(),
          responsebuf.end(),
          std::ostream_iterator<char>(std::cout, ""));

1.重载格式化输出运算符:

std::ostream& operator<<(std::ostream& s, const std::vector<char>& v)
{
    for (char c : v) s << c;
    return s;
}

//...
std::vector<char> responsebuf {'1'};
std::cout << responsebuf;

注意,如果缓冲区实际上包含嵌入的NUL字节作为其数据的一部分,那么要注意这些不同的技术可能会产生不同的输出。

相关问题