也许这是一个愚蠢的问题,但是有没有办法将布尔值转换为字符串,使 1 变为“true”,0 变为“false”?我可以只使用 if 语句,但很高兴知道是否有一种方法可以使用语言或标准库来做到这一点。另外,我是个书呆子。:)
16 回答
使用 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::boolalpha
,std::noboolalpha
该页面会显示控制台输出并解释有关 API 的更多信息。
此外,使用std::boolalpha
将修改 的全局状态std::cout
,您可能希望恢复原始行为,请访问此处以获取有关恢复状态的更多信息std::cout
。
我们在谈论 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 库?你一定在开玩笑?
C++ 有适当的字符串,所以你不妨使用它们。它们在标准标题字符串中。#include <string> 来使用它们。不再有 strcat/strcpy 缓冲区溢出;不再缺少空终止符;不再有杂乱的手动内存管理;具有正确值语义的正确计数字符串。
C++ 也能够将布尔值转换为人类可读的表示形式。我们之前在 iostream 示例中看到了提示,但它们有点受限,因为它们只能将文本发送到控制台(或使用 fstreams,一个文件)。幸运的是,C++ 的设计者并不完全是白痴。我们也有 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 是一个不可接受的瓶颈,那么您应该考虑做一些宏观恐怖。
这应该没问题:
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";
}
C++20std::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:将文本表示(真或假,或特定于语言环境的形式)复制到输出。
- b、B、c、d、o、x、X:使用值为 static_cast(value) 的整数表示类型。
如果您决定使用宏(或在未来的项目中使用 C),您应该在宏扩展中的“b”周围添加括号(我还没有足够的积分来编辑其他人的内容):
#define BOOL_STR(b) ((b)?"true":"false")
这是一种防御性编程技术,可以防止隐藏的操作顺序错误;即,这如何评估所有编译器?
1 == 2 ? "true" : "false"
相比
(1 == 2) ? "true" : "false"
我在 printf 中使用三元,如下所示:
printf("%s\n", b?"true":"false");
如果你宏它:
B2S(b) ((b)?"true":"false")
那么你需要确保你传入的任何东西'b'
都没有任何副作用。并且不要忘记括号周围的括号,'b'
因为您可能会遇到编译错误。
使用 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
无需将 ostream 拖入其中:
constexpr char const* to_c_str(bool b) {
return
std::array<char const*, 2>{"false", "true "}[b]
;
};
这篇文章很旧,但现在您可以使用std::to_string
将很多变量转换为std::string
.
http://en.cppreference.com/w/cpp/string/basic_string/to_string
如果您只执行一次或不想使用 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;
这是很多不必要的函数调用和浪费的性能开销,对于单个布尔值,当一个简单的三元运算符就可以了。
用于boolalpha
将 bool 打印到字符串。
std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;
简单的怎么样:
constexpr char const* toString(bool b)
{
return b ? "true" : "false";
}
我同意宏可能是最合适的。我刚刚编写了一个测试用例(相信我,我不擅长 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;
}
只要可以将字符串直接视为 char 数组,就很难说服我将std::string
字符串表示为 C++ 中的一等公民。
此外,无论如何,将分配和有界结合起来对我来说似乎不是一个好主意。
试试这个宏。任何你想要“真”或假显示的地方只需用 PRINTBOOL(var) 替换它,其中 var 是你想要文本的布尔值。
#define PRINTBOOL(x) x?"true":"false"