使用 c++ 格式化字符串的自然方法



对于 C,我知道人们通常sprintf格式化字符串。

但是,使用C++格式化std::string的自然方法是什么?

int i = 2;
std::string s = std::string("hello letter ") + ('A' + i) + std::string(" bye bye")

预期输出:包含"你好字母 C 再见"的std::string

我得到一个相当神秘的错误:

错误 C2784:"std::reverse_iterator<_RanIt> std::运算符 +(_Diff,const std::reverse_iterator<_RanIt> &(":无法从"int"推断出"const std::reverse_iterator<_RanIt> &"的模板参数

使用to_string('A' + i)时,没有错误,但它打印的是"67"而不是"C"。


注意:_UNICODE定义了(平台:win32/VC++(,我是否仍然可以在代码中有时使用std::string,还是必须在所有地方std::wstring所有内容?

投射到字符,以便std::string::operator+工作。

int i = 2;
std::string s = std::string("hello letter ") + char('A' + i) + std::string(" bye bye");

鉴于i是一个int'A' + i的类型也是int的(参见整数提升规则(。std::string没有intoperator+过载。旁注:重载解析、隐式转换和模板推导对于重用简洁的通用代码非常有用,但在出错时往往会产生令人困惑的错误消息。

字符串确实有一个用于附加char的重载,这可能是您的意图。您可以将表达式中的整数转换回char

char('A' + i)

附言C++标准不能保证'A' + 2代表'C'。这是字符编码的属性,不一定是所有字符编码的情况。

但是用C++格式化std::string的自然方法是什么?

使用std::ostringstream,例如:

#include <string>
#include <sstream>
int i = 2;
std::ostringstream oss;
oss << "hello letter " << char('A' + i) << " bye bye";
std::string s = oss.str();

最新更新