【问题标题】:Natural way to format strings with c++使用 C++ 格式化字符串的自然方法
【发布时间】:2017-12-16 02:47:04
【问题描述】:

使用 C,我知道通常sprintf 来格式化字符串。

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

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

预期输出:std::string 包含“hello letter C bye bye”

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

错误 C2784: 'std::reverse_iterator<_ranit> std::operator +(_Diff,const std::reverse_iterator<_ranit> &)' : 无法推导出 'const std::reverse_iterator<_ranit> & 的模板参数'来自'int'

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


注意:_UNICODE 已定义(平台:win32 / VC++),我是否仍然可以在代码中有时使用std::string,或者它是强制 到处都是std::wstring

【问题讨论】:

  • 'A' 是一个 整数 (!!),但 "A" 是一个 std::string(或者可以是一个,具体取决于上下文)。
  • 先转换为char
  • 'A' + iint 类型,你可以使用char('A' + i)
  • @ForceBru: 'A'char, 它是 'A' + i 类型为 int。 (并且"A" 的类型为const char[2])。
  • @ForceBru -- 'A' 在 C++ 中具有 char 类型。在 C 中是 int

标签: c++ string


【解决方案1】:

但是用 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();

【讨论】:

  • 谢谢!为了将来参考,owstringstream 是 wstring 的等价物吗?
  • @Basj close,实际上是std::wostringstream
【解决方案2】:

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

String 确实有用于附加 char 的重载,这可能是您想要的。您可以将表达式中的整数转换回char

char('A' + i)

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

【讨论】:

  • 谢谢!您如何看待问题的最后一个注释?
  • @Basj 这是一个完全不同的问题,应该在不同的帖子中提出。我对 Windows 的细节了解不多。
  • "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i] 保证拥有'C'i == 2
  • @Jarod42: 它还具有丢失字母的特性,以防您输入错误,并且没有编译器会警告您:-) 'A'+i = 第 i 个字母差不多现在保证,唯一不适用的平台是使用 EBCDIC 的 IBM 恐龙,希望我们中的 99% 可以忽略它们。
【解决方案3】:

转换为 char 以便 std::string::operator+ 工作。

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

【讨论】:

  • 谢谢@Charles!即使std::string s = std::string("hello letter ") + char('A' + i) + " bye bye"; 也有效。但是如何解释std::string s = "hello letter " + char('A' + i) + " bye bye"; 不起作用? ("不能添加两个指针")
  • 对于char*char没有定义+,所以前两个操作数不能相加,因此最后一部分也不能加到结果中前两个...第一个有效,因为您可以将 char 添加到 std::string,然后将结果 (std::string) 添加到 char*
  • 其实可以加一个char*和一个char。它是基本的指针算术(char 只是一个小整数类型),并产生另一个指针,从第一个指针偏移你的 char 的整数值。问题是第二个+,它试图将第一个(char*)的结果与另一个char*相加。
  • @BenjaminLindley 我的错。但是 char*char 并没有按照您想要的方式添加。那是另一回事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多