printf() a std::string_view 的正确方法?

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

我是 C++17 和

std::string_view
的新手。 我了解到它们不是空终止的,必须小心处理。

这是 printf() 的正确方法吗?

#include<string_view>
#include<cstdio>

int main()
{
    std::string_view sv{"Hallo!"};
    printf("=%*s=\n", static_cast<int>(sv.length()), sv.data());
    return 0;
}

(或将其与任何其他 printf 风格的函数一起使用?)

c++ c++17 printf string-view
4个回答
18
投票

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

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

https://godbolt.org/z/nbeMWo1G1

如您所见,您已经接近解决方案了。


10
投票

您可以使用:

assert(sv.length() <= INT_MAX);
std::printf(
    "%.*s",
    static_cast<int>(sv.length()),
    sv.data());

0
投票

如果使用谷歌的 Abseil 库(https://abseil.io/),

absl::PrintF
函数可以安全地打印字符串视图(
std::string_view
absl::string_view
)。

来自

absl::PrintF
的 Abseil 文档,位于 https://github.com/abseil/abseil-cpp/blob/master/absl/strings/str_format.h

std::string_view s = "Ulaanbaatar";
absl::PrintF("The capital of Mongolia is %s", s);

-4
投票

要记住

string_view
的事情是它永远不会修改底层字符数组。因此,如果您将 C 字符串传递给
string_view
构造函数,则
sv.data()
方法将始终返回 相同 C 字符串。

所以,这个特定的情况总是有效的:

#include <string_view>
#include <cstdio>

int main() {
    std::string_view sv {"Hallo!"};
    printf("%s\n", sv.data());
}
© www.soinside.com 2019 - 2024. All rights reserved.