假设我有 string foo("lorem ipsum")
。现在我想打印 foo
中的最大字符数,假设 x
保证小于 foo.size()
。
这在 printf
中非常重要:
printf("%.*s", x, foo.data());
但我能找到的在流中执行此操作的唯一方法是构造一个临时 string
:
cout << string(foo, x);
是否有一个操纵器可以让我设置流的精度,或者正在构建一个临时的 string
所有这些对我可用?
最佳答案
没有“流操纵器”可以在指定宽度后切断字符串。
你要找的基本上是 string_view
(1),这是一些可用于 ostream 的轻量级子字符串包装器。
以下行将打印第一个 x
foo
的字符无需将其复制到临时字符串,只要您提到的保证 ( x >= foo.size()
) 成立:
cout << string_view(foo.data(), x);
如果保证不再有效,请使用 setw
当字符串较短时用空格填充字段,以便打印固定字段长度 x
人物。 string_view
构造函数需要一个适当限制的长度,因为它不知道“真实”std::string
的大小对象,因此我们使用 min
限制x
到字符串的长度:
cout << setw(x) << string_view(foo.data(), min(x, foo.size()));
如果您不想或不能使用 string_view
,您可以编写自己的轻量级包装器,仅用于使用 ostream 打印子字符串。
class substr {
const std::string & s;
std::size_t len;
friend std::ostream& operator<<(std::ostream& os, const substr &ss) {
std::copy(ss.s.begin(), ss.s.begin() + std::min(ss.len, ss.s.size()),
std::ostream_iterator<char>(os));
return os;
}
public:
substr(const std::string & s, std::size_t len) : s(s), len(len) {}
};
那么用法是:
cout << substr(foo, x);
(1) 这个类目前是实验性的,还没有在标准中。据我所知,它可能会出现在 C++17 中,并且可以作为 std::experimental::string_view
获得。在 <experimental/string_view>
从 g++ 4.9 开始使用 -std=c++1y
或 17
.
关于c++ - 字符串的流精度修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34749889/