如何连接"constant strings"和字符?
How do I concatenate "constant strings" and chars?
做以下事情的"正确方法"是什么?(注意,我还不想将消息输出到屏幕上,数据需要存储在一个变量中。)
std::cout << "Enter a letter: ";
char input;
std::cin >> input;
std::string message = "Today's program was brought to you by the letter '" + input + "'.";
代码给了我错误消息类型const char*
和const char [3]
到二进制operator+
的无效操作数。
我明白为什么会出现这个消息。当谷歌搜索一个解决方案时,出现的结果会建议将每个项目依次转换成一个字符串。但是,如果您必须连接一打项目,这就变得不切实际了:
std::string("x:") + x + std::string(", y:") + y + std::string(", width:") + width + std::string(", height:") + height + ...;
在c++中,将字符串、字符、字符数组和任何其他可转换的数据连接到一个字符串中的"正确方式"是什么?c++中有像Python那样漂亮的字符串格式化功能吗? 你想做的事情不会起作用,因为c++将你的连接视为试图添加几个char
指针。如果您显式地将系列中的第一个元素强制转换为std::string
,则应该可以工作。
更改原始代码
string message = "Today's program was brought to you by the letter '" + input + "'.";
:
string message = std::string("Today's program was brought to you by the letter '")
+ input + "'.";
无论如何。这篇文章更详细地讨论了这个问题(尽管我不知道为什么它被关闭了,因为不是一个真正的问题)。
有几种方法可以做到这一点,但是在实现的简单性和便利性之间取得良好平衡的一种方法是使用"formatter"类,它像这样包装std::stringstream
:
string message = formatter() << "Today's program was brought to you by the letter '" << input << "'.";
其中formatter可以在头文件中非常简单地定义如下:
#include <sstream>
class formatter {
public:
template <typename T>
formatter & operator<<(const T & o) {
stream_ << o;
return *this;
}
const std::string str() const { return stream_.str(); }
operator std::string() {
return stream_.str();
}
private:
std::ostringstream stream_;
};
如果你试图使用临时的std::stringstream()
代替上面的formatter()
,它不能工作,因为
-
std::stringstream
不能隐式转换为std::string
你甚至不能这样做
std::string message = (std::stringstream() << "foo" << input << "bar").str();
,因为std::stringstream
从它的流操作返回std::ostream &
(而不是std::stringstream &
),通常你不能将ostream
转换为string
。 formatter类只允许您在一行中构造和使用stringstream
,并且只需要最少的模板。
相关文章:
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 如何正确将"strings"转换为"double"?
- 将错误作为从字符串常量到"char*"的已弃用转换 [-Wwrite-strings]
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- 错误 C2059:语法错误:从结构成员声明'constant'
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 如何修复此错误"the value of 'x1' is not usable in a constant expression"?static_assert
- 有没有办法初始化混合字符和"strings"数组
- 为什么 <constant-int> A / 在 A 无符号时比有符号更快?
- 为什么不允许优化器折叠"constant context"?
- 如何避免"'=': truncation of constant value"的警告消息?
- 警告:ISO C++禁止将字符串常量转换为'char*' [-Wwrite-strings]
- 功能采用variadic模板包将std :: strings转换为const char *
- 当值不能恒定时如何修复"Expression must have a constant value"?
- 将 int 与 double 进行比较的预处理器"invalid integer constant expression"
- 外部"C"导致错误"expected '(' before string constant"
- 我可以忽略"Intellisense: (E0028) expression must have a constant value"吗?
- 即使我没有 #define 任何东西或错过分号,如何修复"expected unqualfied-id before string constant"?
- 如何连接"constant strings"和字符?