【问题标题】:Simplest syntax for string interpolation in c++ [duplicate]C ++中字符串插值的最简单语法[重复]
【发布时间】:2020-07-27 18:56:37
【问题描述】:

我习惯于在 c# 或 JavaScript 中使用易于阅读的字符串插值语法,所以当我开始学习 c++ 时,我希望它会有类似的功能,但是在谷歌搜索 c++ 中的字符串插值时,我不能找不到类似的东西。

在 c# 中,字符串是这样插入的:

$"My variable has value {myVariable}"

在 JavaScript 中是这样的:

`My variable has value ${myVariable}`

在字符串文字的不同位置插入多个值是一个常见问题,我确信在 c++ 中有一些标准方法可以做到这一点。我想知道在 c++ 中执行此操作的最简单方法是什么,以及人们通常如何执行此操作。

【问题讨论】:

标签: c++ string string-interpolation


【解决方案1】:

从 c++20 开始,您可以使用 <format> 标头来执行以下操作:

auto s = std::format("My variable has value {}", myVariable);

这与在 c# 或 JavaScript 中的完成方式非常相似。

【讨论】:

  • 这很酷——一旦我开始使用 C++20,我就会切换到那个......
  • @wcochran 当然,谁不是? :) 如果你不想等待,你可以考虑使用 fmt 这个标题的灵感来源。
  • 不像 c#/js 那样易于阅读,但仍然相当不错。但是如果这将在 c++20 中,那么人们现在通常使用什么方法呢?
  • @Kacper 取决于用例,但人们经常使用printfto_string 之类的东西,或者fmt 之类的一些外部库。
  • 这不容易阅读。您应该以“不是真的,但是...”之类的开头来回答这个问题
【解决方案2】:

一种可能的方法,尤其是在嵌入式环境中,是利用 C 标准库:

#include <cstdio>

...
printf("My variable is %s\n", myVariable)
...

myVariable 必须是 char*。对于 C++ 字符串,应使用myVariable.c_str()

【讨论】:

  • 顺便说一句,sprintf 可用于打印到字符串。
  • sprintf 打印到 C 字符串(不是 std::string)和 sprintf 不安全,使用它时应该收到编译器警告。至少使用snprintf,这将有助于避免缓冲区溢出。
  • asprintf(...) 也可能用于 GNU 环境,它可以处理动态内存分配。或者,或者,将vsnprintf(...) 放入堆栈上的缓冲区,然后从该缓冲区生成std::string。此功能可能有相同的 stl API 调用。
【解决方案3】:

FWIW,这是 sprintf 的 C++11 安全版本,它返回 std::string

template<typename... Args>
std::string Sprintf(const char *fmt, Args... args)
{
    const size_t n = snprintf(nullptr, 0, fmt, args...);
    std::vector<char> buf(n+1);
    snprintf(buf.data(), n+1, fmt, args...);
    return std::string(buf.data());
}

然后你可以这样做:

float var = 0.123f;
std::string str = Sprintf("My variable has value %0.4f\n", var);

如果您使用 C++20,我喜欢 @cigien 的回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2021-08-08
    • 2013-06-25
    相关资源
    最近更新 更多