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

Posted

技术标签:

【中文标题】在 C++ 中将 bool 转换为文本【英文标题】:Converting bool to text in C++ 【发布时间】:2010-09-06 23:04:21 【问题描述】:

也许这是一个愚蠢的问题,但是有没有办法将布尔值转换为字符串,使 1 变为“true”,0 变为“false”?我可以只使用 if 语句,但很高兴知道是否有一种方法可以使用语言或标准库来做到这一点。另外,我是个书呆子。 :)

【问题讨论】:

反对!本地化呢?为什么一种语言本身会包含特定于语言的文字常量? @valdo - 我很确定对于我正在从事的项目,国际化不是问题。当时,这可能是一个学校项目。 【参考方案1】:

使用 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's page talking about std::boolalpha and std::noboolalpha,它会向您显示控制台输出并解释有关 API 的更多信息。

另外使用std::boolalpha会修改std::cout的全局状态,你可能想恢复原来go here for more info on restoring the state of std::cout的行为。

【讨论】:

我完全是 C++ 新手。有人可以向我解释这是如何工作的吗? @Chucky 在您了解operator overloading 之前,您将无法理解这是如何工作的。解释它是如何工作的将远远超出这个问题的范围。您需要将其作为不同的问题发布,或者查找该问题的现有答案。 I recommend the latter. 这只会将布尔值打印为文本,不会将它们转换为文本/字符串。 那么这会以什么方式使OP给出的“将布尔值转换为字符串”标准失败? 此代码不会将布尔值转换为字符串。如果可以的话,创建一个变量std::string str 并将转换结果保存到其中。【参考方案2】:

我们说的是 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,接受的答案太慢了。如果“true”和“false”的字符串常量存储在静态 const 变量中,则可以针对 string 改进这一点。 这是一个有问题的答案,因为: 1. 有时你想要“是”或“否”而不是“真”或“假”,有时是“成功”与“失败”等 2。有时需要小写,有时需要大写,有时需要大写。 阅读问题,这正是所要求的。 @einpoklum 没有什么能阻止您为所需的转换创建尽可能多的内联函数。 在紧要关头你可以这样做:cout &lt;&lt; (bool_x ? "true": "false") &lt;&lt; endl;【参考方案3】:

C++ 有适当的字符串,所以你不妨使用它们。它们在标准标题字符串中。 #include 来使用它们。不再有 strcat/strcpy 缓冲区溢出;不再缺少空终止符;不再有杂乱的手动内存管理;具有正确值语义的正确计数字符串。

C++ 也能够将布尔值转换为人类可读的表示形式。我们之前在 iostream 示例中看到了提示,但它们有点受限,因为它们只能将文本发送到控制台(或使用 fstreams,一个文件)。幸运的是,C++ 的设计者并不完全是白痴。我们也有 iostream,它们不是由控制台或文件支持,而是由自动管理的字符串缓冲区支持。它们被称为字符串流。 #include 来获取它们。那么我们可以说:

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("true") 做正确的事。您可以将它们与数字一起使用,实际上可以将它们与具有正确格式的 I/O 运算符的任何类型一起使用。所以它们用途广泛且非常有用。

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

【讨论】:

boost::lexical_cast("true") 似乎抛出了 bad_lexical_cast 异常 在我的应用程序中不起作用,"isExist: "+boost::lexical_cast<:string>(isExit));结果存在:0 Keep an eye to performance【参考方案4】:

这应该没问题:


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++20 std::format(""

https://en.cppreference.com/w/cpp/utility/format/formatter#Standard_format_specification 声称默认输出格式默认为字符串:

#include <format>
auto s6 = std::format(":6", true);  // value of s6 is "true  "

和:

可用的布尔表示类型有:

none, s:将文本表示(true 或 false,或特定于区域设置的形式)复制到输出。 b、B、c、d、o、x、X:使用值为 static_cast(value) 的整数表示类型。

相关:std::string formatting like sprintf

【讨论】:

【参考方案6】:

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

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

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

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

相比

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

【讨论】:

即使在获得 2k 代表之前,您实际上也可以编辑其他人的内容。它将被审查,但你当然可以。【参考方案7】:

我像这样在 printf 中使用三元:

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

如果你宏它:

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

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

【讨论】:

“b”在宏定义中只出现一次,为什么要警告副作用?【参考方案8】:

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

bool to_converttrue;
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

【讨论】:

【参考方案9】:

无需将ostream拖入其中:

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

【讨论】:

【参考方案10】:

这篇文章很旧,但现在您可以使用std::to_string 将很多变量转换为std::string

http://en.cppreference.com/w/cpp/string/basic_string/to_string

【讨论】:

你可以,但如果你对布尔变量执行此操作,它只会转换数值,“1”或“0”,而不是“true”或“false”。【参考方案11】:

使用 boolalpha 将 bool 打印到字符串。

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

C++ Reference

【讨论】:

【参考方案12】:

简单的怎么样:

constexpr char const* toString(bool b)

   return b ? "true" : "false";

【讨论】:

【参考方案13】:

如果您只执行一次或不想使用 bool alpha 更改全局设置,一个非常快速且干净的解决方案是直接在流中使用三元运算符,如下所示:

bool myBool = true;
std::cout << "The state of myBool is: " << (myBool ? "true" : "false") << std::endl;
enter code here

三元组很容易学习。它们只是关于节食的 IF 声明,可以在任何地方很好地删除,并且:

(myBool ? "true" : "false")

这个(有点)很好:


   if(myBool)
      return "true";
    else 
      return "false";
   

您可以找到三元的各种有趣用途,包括这里,但如果您总是使用它们将“真”“假”输出到这样的流中,您应该打开 boolalpha 功能,除非你有理由不这样做:

std::cout << std::boolalpha;

在代码顶部的某个位置,只需全局启用该功能,这样您就可以将那些甜蜜的布尔值直接放入流中,而不必担心。

但不要把它当作一次性使用的标签,像这样:

std::cout << "The state of myBool is: " << std::boolalpha << myBool << std::noboolalpha;

这是很多不必要的函数调用和浪费的性能开销,对于单个布尔值,一个简单的三元运算符就可以了。

【讨论】:

【参考方案14】:

我同意宏可能是最合适的。我刚刚编写了一个测试用例(相信我,我不擅长 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;

【讨论】:

【参考方案15】:

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

此外,无论如何,将分配和有界性结合起来对我来说似乎不是一个好主意。

【讨论】:

【参考方案16】:

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

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

【讨论】:

该宏中需要一些括号,这可能就是您投反对票的原因。

以上是关于在 C++ 中将 bool 转换为文本的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 C++ 中将 bitset<8> 转换为 char?

在 SQL Server 中将 Bool 转换为 Bit

在 C++ 中将 24 小时时间转换为整数值 [关闭]

尝试在 C++ 中将字符串转换为双精度时遇到分段错误

如何在golang中将bool转换为int8 [重复]

如何在c中将bool的输出从1和0转换为true或false [重复]