我有一个有趣的问题。初始化我的向量后,我看到数据后面有一些垃圾。下面是我的调试器显示的内容:
下面是我如何初始化我的vector:
std::vector<char> responsebuf {'1'};
当我尝试使用responsebuf.data()输出缓冲区的内容时,出现了问题:
responsebuf.data()
std::cout << responsebuf.data();
我怎样才能输出数据而不得到这些垃圾字节呢?
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字节作为其数据的一部分,那么要注意这些不同的技术可能会产生不同的输出。
1条答案
按热度按时间lokaqttq1#
vector可能已经分配了也可能没有分配超过其初始大小的额外内存。无论哪种方式,都不允许访问该内存。这样做是未定义的行为。它并不是内存中存在太多“垃圾”,而是更像是“不关程序的事”。
由于你显然希望你的vector的内容表现得像以NULL结尾的字符串,你有几个选择:
1.在构造时显式终止:
1.稍后追加一个NUL字符:
1.使用string_view:
1.使用ostream_iterator:
1.重载格式化输出运算符:
注意,如果缓冲区实际上包含嵌入的NUL字节作为其数据的一部分,那么要注意这些不同的技术可能会产生不同的输出。