我想做类似以下的事情:
bool b = ...
string s = "Value of bool is: " + b ? "f" : "d";
我见过的所有例子都使用了cout
,但我不想打印字符串;只是存储它。
我该怎么做?如果可能的话,我想要一个分配给 achar *
和一个分配给 a 的示例std::string
。
我想做类似以下的事情:
bool b = ...
string s = "Value of bool is: " + b ? "f" : "d";
我见过的所有例子都使用了cout
,但我不想打印字符串;只是存储它。
我该怎么做?如果可能的话,我想要一个分配给 achar *
和一个分配给 a 的示例std::string
。
如果你的编译器足够新,它应该有std::to_string
:
string s = "Value of bool is: " + std::to_string(b);
这当然会附加"1"
(for true
) 或"0"
(for false
) 到您的字符串,而不是"f"
或"d"
根据您的需要。原因是没有std::to_string
需要bool
类型的重载,因此编译器将其转换为整数值。
您当然可以分两步进行,首先声明字符串,然后附加值:
string s = "Value of bool is: ";
s += b ? "f" : "d";
或者像现在一样做,但明确地将第二个创建为std::string
:
string s = "Value of bool is: " + std::string(b ? "f" : "d");
编辑:如何char
从std::string
这是通过std::string::c_str
方法完成的。但正如 Pete Becker 所指出的,您必须小心如何使用此指针,因为它指向字符串对象内的数据。如果对象被销毁,数据也会被销毁,如果保存,指针现在将无效。
std::ostringstream s;
s << "Value of bool is: " << b;
std::string str(s.str());
并且您可以使用std::boolalpha
to"true"
或"false"
代替int
表示:
s << std::boolalpha << "Value of bool is: " << b;
注意发布的代码几乎是正确的(不可能是+
两个char[]
):
std::string s = std::string("Value of bool is: ") + (b ? "t" : "f");
要分配给char[]
您可以使用snprintf()
:
char buf[1024];
std::snprintf(buf, 1024, "Value of bool is: %c", b ? 't' : 'f');
或者只是std::string::c_str()
。
很简单:
std::string s = std::string("Value of bool is: ") + (b ? "f" : "d");
我会使用std::stringstream
:
std::stringstream ss;
ss << s << (b ? "f" : "d");
std::string resulting_string = ss.str();
分两步执行操作:
bool b = ...
string s = "Value of bool is: ";
s+= b ? "f" : "d";
这是必要的,因为否则您将尝试将两个相加const char *
,这是不允许的;相反,这种方式依赖于+=
运算符 forstd::string
和 C 字符串的重载。
简单点:
bool b = ...
string s = "Value of bool is: ";
if (b)
s += "f";
else
s += "d";
封装:
std::string toString(const bool value)
{
return value ? "true" : "false";
}
然后:
std::string text = "Value of bool is: " + toString(b);
你也可以使用 strcat()
char s[80];
strcpy(s, "Value of bool is ");
strcat(s, b?"f":"d");
对于这个简单的用例,只需将一个字符串附加到另一个字符串:
std::string text = std::string("Value of bool is: ").append( value? "true" : "false" );
现在,对于更通用的解决方案,您可以创建一个字符串构建器类:
class make_string {
std::ostringstream st;
template <typename T>
make_string& operator()( T const & v ) {
st << v;
}
operator std::string() {
return st.str();
}
};
它可以很容易地扩展以支持操纵器(添加几个额外的重载),但这足以满足大多数基本用途。然后将其用作:
std::string msg = make_string() << "Value of bool is " << (value?"true":"false");
(同样,在这种特殊情况下,这是矫枉过正,但如果你想组成一个更复杂的字符串,这将是有帮助的)。