c++中字符串插值的最简单语法
Simplest syntax for string interpolation in c++
我在 c# 或 JavaScript 中习惯了像这样的易于阅读的字符串插值语法,所以当我开始学习 c++ 时,我希望它具有类似的功能,但是在谷歌搜索时c++ 中的字符串插值我找不到类似的东西。
在 C# 中,字符串是这样插入的:
$"My variable has value {myVariable}"
在 JavaScript 中看起来像这样:
`My variable has value ${myVariable}`
在字符串文字的不同位置插入多个值是一个很常见的问题,我确信在 C++ 中有一些标准的方法可以做到这一点。我想知道在 C++ 中执行此操作的最简单方法是什么以及人们通常如何执行此操作。
一种可能的方法,特别是在嵌入式环境中,是利用 C 标准库:
#include <cstdio>
...
printf("My variable is %s\n", myVariable)
...
myVariable
必须是 char*
。对于 C++ 字符串,应使用 myVariable.c_str()
。
从 c++20 开始,您可以使用 <format>
header 来做这样的事情:
auto s = std::format("My variable has value {}", myVariable);
这与在 c# 或 JavaScript 中的完成方式非常相似。
FWIW,这是 sprintf
的 C++11 安全版本 returns 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 的回答。
我在 c# 或 JavaScript 中习惯了像这样的易于阅读的字符串插值语法,所以当我开始学习 c++ 时,我希望它具有类似的功能,但是在谷歌搜索时c++ 中的字符串插值我找不到类似的东西。
在 C# 中,字符串是这样插入的:
$"My variable has value {myVariable}"
在 JavaScript 中看起来像这样:
`My variable has value ${myVariable}`
在字符串文字的不同位置插入多个值是一个很常见的问题,我确信在 C++ 中有一些标准的方法可以做到这一点。我想知道在 C++ 中执行此操作的最简单方法是什么以及人们通常如何执行此操作。
一种可能的方法,特别是在嵌入式环境中,是利用 C 标准库:
#include <cstdio>
...
printf("My variable is %s\n", myVariable)
...
myVariable
必须是 char*
。对于 C++ 字符串,应使用 myVariable.c_str()
。
从 c++20 开始,您可以使用 <format>
header 来做这样的事情:
auto s = std::format("My variable has value {}", myVariable);
这与在 c# 或 JavaScript 中的完成方式非常相似。
FWIW,这是 sprintf
的 C++11 安全版本 returns 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 的回答。