在C ++中将布尔转换为文本


93

也许这是一个愚蠢的问题,但是有什么方法可以将布尔值转换为字符串,以使1变为“ true”而0变为“ false”?我可以只使用if语句,但是很高兴知道是否可以使用语言或标准库来执行此操作。另外,我是一个学徒。:)


6
异议!本地化呢?为什么语言本身会包含特定于语言的文字常量?
瓦尔多

1
@valdo-我非常确定对于我正在从事的项目,国际化不是问题。当时,这可能是一个学校项目。
杰森·贝克

Answers:


118

如何使用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;

更新:

如果你想超过4行代码没有任何控制台输出,请到cppreference.com的页面谈论std::boolalphastd::noboolalpha你显示控制台输出,并详细解释了该API。

另外使用 std::boolalpha会修改的全局状态std::cout,您可能需要恢复原始行为,请转到此处以获取有关恢复的状态的更多信息std::cout


我是C ++的新手。有人可以向我解释这是如何工作的吗?
Chucky

4
@Chucky在您了解运算符重载之前,您将无法理解其工作原理。解释其工作原理将远远超出此问题的范围。您需要将其发布为其他问题,或者查找该问题的现有答案。我推荐后者
Michael Dorst

2
这只会将布尔值打印为文本,不会将它们转换为文本/字符串。
atoMerz 2014年

那么,以哪种方式无法通过OP给出的“将布尔值转换为字符串”标准?
graham.reeds 2014年

2
此代码不会将布尔值转换为字符串。创建一个变量,std::string str然后将转换结果保存到该变量中。
rozina '16

76

我们在谈论C ++对吗?我们到底为什么还在使用宏!

C ++内联函数为您提供与宏相同的速度,并具有类型安全性和参数评估的额外好处(这避免了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库吗?你一定在开玩笑?


@NathanFellman,可接受的答案太慢。string如果将“ true”和“ false”的字符串常量存储在静态const变量中,则可以对此进行改进。
Serge Rogatch 2015年

这是一个有问题的答案,因为:1.有时您想要“是”或“否”,而不是“是或否”,有时是“成功”与“失败”等。2.有时您希望使用小写字母,有时需要使用大写字母案,有时是标题案
einpoklum '16

2
阅读问题,这正是所要求的。
OJ。

@einpoklum没有什么可以阻止您为所需的转换创建尽可能多的内联函数。
rozina '16

2
在紧急情况下,您可以执行以下操作:cout << (bool_x ? "true": "false") << endl;
Trevor Boyd Smith,

22

C ++具有适当的字符串,因此您不妨使用它们。它们在标准标题字符串中。#include <string>来使用它们。没有更多的strcat / strcpy缓冲区溢出;不再缺少空终止符;不再麻烦的手动内存管理;具有正确值语义的正确计数字符串。

C ++也能够将布尔转换为人类可读的表示形式。之前我们在iostream示例中看到了提示,但由于它只能将文本放到控制台(或使用fstreams,一个文件),因此它们有一定的局限性。幸运的是,C ++的设计者并不是白痴。我们还提供了不由控制台或文件支持的iostream,而是由自动管理的字符串缓冲区支持的iostream。它们称为字符串流。#include <sstream>来获取它们。然后我们可以说:

std::string bool_as_text(bool b)
{
    std::stringstream converter;
    converter << std::boolalpha << b;   // flag boolalpha calls converter.setf(std::ios_base::boolalpha)
    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是不可接受的瓶颈,那么您就应该考虑做一些宏观恐怖了。


3
boost :: lexical_cast <bool>(“ true”)似乎抛出bad_lexical_cast异常
用户

3
在我的应用中不起作用,“ isExist:” + boost :: lexical_cast <std :: string>(isExit));结果isExist:0
Scott混合理论

7

这应该很好:


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

但是,如果您想做更多C ++式的操作:


#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

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

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

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

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

相比

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

甚至在没有2k销售代表之前,您实际上就可以编辑其他人的内容。它将进行审核,但是您当然可以。
SysDragon

2

我在printf中使用三元是这样的:

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

如果您将其宏化:

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

那么您需要确保您传递的'b'任何内容都没有任何副作用。并且不要忘记括号,'b'因为您可能会遇到编译错误。


由于“ b”在宏定义中仅显示一次,因此为什么要警告副作用?
未来主义者

2

使用C ++ 11时,您可以使用lambda来获得稍微紧凑的代码并就地使用:

bool to_convert{true};
auto bool_to_string = [](bool b) -> std::string {
    return b ? "true" : "false";
};
std::string str{"string to print -> "};
std::cout<<str+bool_to_string(to_convert);

印刷品:

string to print -> true


1

无需将ostream拖入其中:

constexpr char const* to_c_str(bool b) {
   return  
    std::array<char const*, 2>{"false", "true "}[b]
   ;
};

0

用于boolalpha将bool打印为字符串。

std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;

C ++参考


0

简单如何:

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

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

-5

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

此外,将分配和边界结合起来对我来说似乎不是一个好主意。


-7

试试这个宏。只要要显示“ true”或false的任何地方,都可以将其替换为PRINTBOOL(var),其中var是您想要文本使用的布尔值。

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

2
在该宏中需要一些括号,这可能就是为什么您选择了否决票。
未来主义者
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.