c++ - 字符串的流精度修饰符

标签 c++ printf precision cout iomanip

假设我有 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);

Live Example


(1) 这个类目前是实验性的,还没有在标准中。据我所知,它可能会出现在 C++17 中,并且可以作为 std::experimental::string_view 获得。在 <experimental/string_view>从 g++ 4.9 开始使用 -std=c++1y17 .

关于c++ - 字符串的流精度修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34749889/

相关文章:

c++ - 在条件和阻塞调用之间收到 C/C++ SIGINT

c++ - Scons:使用 Object builder 构建头文件

c# - 你能喝一个 boost::optional<> 吗?

c++ - 为什么 SetWindowsHookEx 不接受钩子(Hook)程序?

Bash Printf 颠倒了参数的顺序

c - 在 C 中使用 printf 打印空格数

在不同的系统上编译相同的程序会产生不同的结果吗?

python - 有没有办法在 Python 中获取分数的重复小数部分?

c# - 确定输入数字的小数精度

c# - 乘法时的小数精度