c++ printf()一个std::string_view的正确方法?

sy5wg1nm  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(249)

我是C++17和std::string_view的新手。我了解到,它们不是空终止的,必须小心处理。
这是printf()one的正确方法吗?

  1. #include<string_view>
  2. #include<cstdio>
  3. int main()
  4. {
  5. std::string_view sv{"Hallo!"};
  6. printf("=%*s=\n", static_cast<int>(sv.length()), sv.data());
  7. return 0;
  8. }

(or使用它与其他printf风格的函数?)

wlwcrazw

wlwcrazw1#

您可以用途:

  1. assert(sv.length() <= INT_MAX);
  2. std::printf(
  3. "%.*s",
  4. static_cast<int>(sv.length()),
  5. sv.data());
3gtaxfhh

3gtaxfhh2#

关于string_view需要记住的是,它永远不会修改底层的字符数组。所以,如果你传递一个C字符串给string_view构造函数,sv.data()方法将总是返回 * 相同的 * C字符串。
所以,这个特定的案例总是有效的:

  1. #include <string_view>
  2. #include <cstdio>
  3. int main() {
  4. std::string_view sv {"Hallo!"};
  5. printf("%s\n", sv.data());
  6. }
zrfyljdw

zrfyljdw3#

这是一个奇怪的要求,但它是可能的:

  1. std::string_view s{"Hallo this is longer then needed!"};
  2. auto sub = s.substr(0, 5);
  3. printf("=%.*s=\n", static_cast<int>(sub.length()), sub.data());

https://godbolt.org/z/nbeMWo1G1
正如你所看到的,你已经接近解决方案。

相关问题