在C ++中将布尔转换为文本
也许这是一个愚蠢的问题,但是有什么方法可以将布尔值转换为字符串,以使1变为" true"而0变为" false"?我可以只使用if语句,但是很高兴知道是否可以使用语言或者标准库来执行此操作。另外,我是一个学徒。 :)
解决方案
回答
我同意宏可能是最合适的。我只是整理了一个测试用例(相信我,我对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; }
回答
试试这个宏。只要要显示" true"或者false的任何地方,都可以将其替换为PRINTBOOL(var),其中var是想要文本使用的布尔值。
#define PRINTBOOL(x) x?"true":"false"
回答
我在printf中使用三元是这样的:
printf("%s\n", b?"true":"false");
如果我们将其宏化:
B2S(b) ((b)?"true":"false")
那么我们需要确保以" b"传递的内容没有任何副作用。并且不要忘记'b'周围的括号,因为这样可能会导致编译错误。
回答
如果决定使用宏(或者在将来的项目中使用C),则应在宏扩展中的" b"周围添加括号(我还没有足够的要点来编辑其他人的内容):
#define BOOL_STR(b) ((b)?"true":"false")
这是一种防御性的编程技术,可以防止出现隐藏的操作顺序错误。即,这如何评估所有编译器?
1 == 2 ? "true" : "false"
相比
(1 == 2) ? "true" : "false"
回答
如何使用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;
更新:
如果我们想要四行以上的代码而没有任何控制台输出,请转到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"; }
回答
只要可以将字符串直接视为char数组,就很难使我相信std :: string
将字符串表示为C ++中的一等公民。
此外,无论如何,将分配与边界结合起来似乎对我来说不是一个好主意。