将bool转换为C ++中的文本

也许这是一个愚蠢的问题,但有什么办法将一个布尔值转换为一个string,使1变成“真”,0变成“假”? 我可以只使用一个if语句,但是很高兴知道是否有一种方法可以用语言或标准库来实现。 另外,我是一个学生。 🙂

如何使用C ++语言本身?

bool t = true; bool f = false; std::cout << std::noboolalpha << t << " == " << std::boolalpha << t << std::endl; std::cout << std::noboolalpha << f << " == " << std::boolalpha << f << std::endl; 

我们在谈论C ++吧? 为什么我们仍然在使用macros!?

C ++内联函数为您提供了与macros相同的速度,同时还增加了types安全性和参数评估的好处(避免了Rodney和dwj提到的问题。

 inline const char * const BoolToString(bool b) { return b ? "true" : "false"; } 

除此之外,我还有一些其他的抱怨,特别是接受的答案:)

 // this is used in C, not C++. if you want to use printf, instead include <cstdio> //#include <stdio.h> // instead you should use the iostream libs #include <iostream> // not only is this a C include, it's totally unnecessary! //#include <stdarg.h> // Macros - not type-safe, has side-effects. Use inline functions instead //#define BOOL_STR(b) (b?"true":"false") inline const char * const BoolToString(bool b) { return b ? "true" : "false"; } int main (int argc, char const *argv[]) { bool alpha = true; // printf? that's C, not C++ //printf( BOOL_STR(alpha) ); // use the iostream functionality std::cout << BoolToString(alpha); return 0; } 

干杯:)


@DrPizza:为了一个简单的函数,包含一个完整的boost库文件? 你一定在开玩笑?

耶稣哭了。

好的,你问了C ++。 不是C.不要疯狂的macros 。 C ++。

C ++有适当的string。 不C的愚蠢的NTBS废话。 适当的string。 使用它们! 他们在标准的标题string中。 #include <string>来使用它们。 没有更多的strcat / strcpy缓冲区溢出; 没有更多的缺less空终止符; 没有更杂乱的手动内存pipe理; 正确计数的string与适当的值语义。

C ++有能力将bools转换为可读的表示。 我们在前面看到了iostream示例的提示,但是它们有点受限制,因为它们只能将文本发送到控制台(或者fstreams,一个文件)。 幸运的是,C ++的devise者并不是完全的白痴, 我们也有不是由控制台或文件支持的iostream,而是通过自动pipe理的string缓冲区。 他们被称为stringstreams。 #include <sstream>来获取它们。 那么我们可以说:

 std::string bool_as_text(bool b) { std::stringstream converter; converter << b; return converter.str(); } 

当然,我们并不想打字。 幸运的是,C ++还有一个名为Boost的方便的第三方库,可以帮助我们。 Boost有一个很好的函数叫做lexical_cast。 我们可以这样使用它:

 boost::lexical_cast<std::string>(my_bool) 

现在可以这么说,这比一些macros观开销要高; stringstreams处理您可能不关心的语言环境,并创build一个dynamicstring(与内存分配),而macros可以产生一个文字string,从而避免这种情况。 但另一方面,stringstream方法可用于打印和内部表示之间的大量转换。 你可以向后运行, boost :: lexical_cast <bool>(“true”)做正确的事情,例如。 您可以使用它们的数字,事实上任何types与正确的格式化I / O操作。 所以他们是相当多才多艺和有用的。

如果毕竟这个分析和基准testing揭示了lexical_casts是一个不可接受的瓶颈, 那么当你应该考虑做一些macros观恐怖的时候。

这应该没问题:

 const char* bool_cast(const bool b) { return b ? "true" : "false"; } 

但是,如果你想要做更多的C + + – ISH:

 #include <iostream> #include <string> #include <sstream> using namespace std; string bool_cast(const bool b) { ostringstream ss; ss << boolalpha << b; return ss.str(); } int main() { cout << bool_cast(true) << "\n"; cout << bool_cast(false) << "\n"; } 

如果你决定使用macros(或者在未来的项目中使用C),你应该在macros扩展的'b'周围添加括号(我没有足够的点来编辑其他人的内容):

 #define BOOL_STR(b) ((b)?"true":"false") 

这是一种防御性编程技术,可以防止隐藏的操作顺序错误; 即,这是如何评估所有编译器?

 1 == 2 ? "true" : "false" 

相比

 (1 == 2) ? "true" : "false" 

我在这样的printf中使用了一个三元组:

 printf("%s\n", b?"true":"false"); 

如果你macros观:

 B2S(b) ((b)?"true":"false") 

那么你需要确保你传入的内容是'b'没有任何副作用。 不要忘了'b'的括号,因为你可能会遇到编译错误。

我同意一个macros观可能是最合适的。 我刚刚掀起了一个testing用例(相信我对C / C ++不太好,但是这听起来很有趣):

 #include <stdio.h> #include <stdarg.h> #define BOOL_STR(b) (b?"true":"false") int main (int argc, char const *argv[]) { bool alpha = true; printf( BOOL_STR(alpha) ); return 0; } 

只要string可以直接作为char数组来看,就很难说服std::string表示为C ++中的一等公民。

而且,对我来说,结合分配和有限性似乎是一个坏主意。

试试这个macros。 任何你想要显示“true”或false的地方,只要把它replace成PRINTBOOL(var),其中var就是你想要的文本。

 #define PRINTBOOL(x) x?"true":"false"