2008-08-27 104 views
65

也许这是一个愚蠢的问题,但是有什么方法可以将一个布尔值转换为一个字符串,使得1变成“true”,0变成“false”?我可以只使用if语句,但很高兴知道是否有方法使用语言或标准库来实现这一点。另外,我是一个学生。 :)将bool转换为C++中的文本

+4

异议!本地化呢?为什么一种语言本身包含语言特定的文字常量? – valdo 2013-05-28 22:28:38

+0

@valdo - 我非常肯定,对于我正在开展的项目,国际化不是问题。当时,这可能是一个学校项目。 – 2013-06-01 19:20:54

回答

99

有关使用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; 
+0

我是C++的完全新手。有人可以向我解释这是如何工作的吗? – Chucky 2013-02-20 14:06:56

+3

@Chucky在理解[运算符重载](http://stackoverflow.com/questions/4421706/operator-overloading)之前,您将无法理解这是如何工作的。解释这种工作方式将远远超出这个问题的范围。您需要将其作为一个不同的问题发布,或者查找该问题的现有答案。 [我推荐后者](http://mattgemmell.com/2008/12/08/what-have-you-tried/)。 – anthropomorphic 2013-04-09 11:55:31

-5

我同意宏可能是最合适的。我刚刚刮起了测试用例(相信我,我没有很好的与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; 
} 
-7

试试这个宏。任何你想要显示“true”或false的地方,只需用PRINTBOOL(var)替换它,其中var是你想要的文本的布尔值。

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

在该宏中需要一些括号,这可能是为什么你得到了downvote。 – postfuturist 2008-10-25 21:45:49

1

我用三元在一个printf像这样:

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

如果宏是:

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

,那么你需要确保无论你在通过为'b'没有按”没有任何副作用。不要忘记'b'的括号,因为你可能会遇到编译错误。

+0

由于'b'只在宏定义中出现一次,为什么要警告副作用? – postfuturist 2008-10-25 21:42:58

4

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

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

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

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

相比

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

甚至在拥有de 2k代表之前,您实际上可以编辑其他人的内容。它会被审查,但当然你可以。 – SysDragon 2014-08-05 08:49:28

59

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

C++内联函数给你相同的速度宏,用它避免了问题的类型安全和参数评测(额外的好处是罗德尼和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 lib?你一定在开玩笑?

21

耶稣哭了。

好的,你问了C++。不是C.不结帐。 C++。

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

C++还能够将bools转换为可读的表示。我们在前面看到了iostream示例的提示,但它们有点受限制,因为它们只能将文本发送到控制台(或使用fstreams,文件)。幸运的是,C++的设计者并不是完全白痴,我们还有iostreams,它们不是由控制台或文件支持,而是由自动管理的字符串缓冲区支持。他们被称为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) 

现在的确可以说,这是比一些宏更高的开销; stringstreams处理您可能不关心的语言环境,并创建一个动态字符串(使用内存分配),而宏可以产生一个文字字符串,从而避免这种情况。但另一方面,stringstream方法可用于可打印和内部表示之间的大量转换。你可以向后运行, boost :: lexical_cast <bool>(“true”)做对了,例如。您可以将它们与数字一起使用,实际上也可以使用格式正确的I/O操作符。所以它们非常灵活和有用。

如果毕竟这个分析和基准测试显示lexical_casts是一个不可接受的瓶颈,当你应该考虑做一些宏观恐怖时,就是

6

这应该是罚款:


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"; 
} 
-5

只要字符串可以直接作为字符数组它会被视为我很难说服std::string将字符串表示为C++中的一等公民。

此外,结合分配和有界性似乎对我来说是一个坏主意。