如何使用 fmt 打印字符向量?

问题描述 投票:0回答:3

我有一个

const std::vector<char>
- not 空终止。我想使用 fmt 库打印它,而不复制矢量。

我希望指定精度就足够了,但是 fmt 文档 说:

请注意,即使指定了精度,C 字符串也必须以 null 结尾。

好吧,我的不是。我必须复制并用

\0
填充它,还是我可以做其他事情?

c++ c++14 c++-standard-library null-terminated fmt
3个回答
8
投票

如果你可以升级到 C++17,那么你可以使用 strig 视图参数而不是指向 char 的指针:

const std::vector<char> v;
std::string_view sv(v.data(), v.size());
fmt::format("{}", sv);

4
投票

使用

fmt::join
怎么样?

返回一个视图,格式范围内的元素由 sep.

分隔

[演示]

#include <fmt/ranges.h>
#include <vector>

int main() {
    std::vector<char> v{'a', 'b', 'c'};
    fmt::print("{}", fmt::join(v, ""));
}

// Outputs:
//
//   abc

2
投票

tl;博士

std::cout << fmt::format("{}", fmt::string_view{v.data(), v.size()});


所以,fmt 接受两种“字符串”:

  • C 风格 - 只是一个指针,必须以 null 结尾。
  • std::string
    -like
    - 数据+长度。

自 C++17 起,C++ 正式拥有引用类型,

std::string
-like string view 类,它可以引用您的字符向量。 (不复制任何东西)-
fmt
可以打印这些。问题是,你可能不在 C++17 中。但是
fmt
本身也必须在内部面对这个问题,所以它实际上 让你覆盖 - 在任何版本的标准中你都可以让 fmt 本身编译,特别是 C++14:

const std::vector<char> v;
fmt::string_view sv(v.data(), v.size());
auto str = fmt::format("{}", sv);
std::cout << str;

感谢@eerorika 让我想到了字符串视图。

© www.soinside.com 2019 - 2024. All rights reserved.