如何使用fmt库打印非空终止std::vector<char>且不拷贝数据
实现方案
不需要拷贝vector数据补\0,fmt原生支持零拷贝打印非空终止的字符序列:
- 核心方法是使用
fmt::string_view包装vector的内存指针和长度,该类型自带长度元信息,fmt处理时不会按照C字符串的规则检索空终止符,全程无额外数据拷贝:
const std::vector<char> vec; // 持有的非空终止字符vector // 零拷贝传入打印 fmt::print("{}", fmt::string_view(vec.data(), vec.size()));
- 需要限制输出长度时,直接在格式串中指定精度即可,不会触发越界读取:
// 仅输出前8个字符 fmt::print("{:.8}", fmt::string_view(vec.data(), vec.size()));
文档中提到的「指定精度也要求空终止」的规则,仅针对传入参数为原生
const char*类型的C字符串场景,对自带长度信息的fmt::string_view、std::string_view类型参数不适用。
如果需要输出不可打印字符的十六进制值,直接搭配fmt的格式修饰符使用即可,同样不需要额外拷贝数据。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

