对于 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
没有int
的operator+
过载。旁注:重载解析、隐式转换和模板推导对于重用简洁的通用代码非常有用,但在出错时往往会产生令人困惑的错误消息。
字符串确实有一个用于附加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();