也许这是一个愚蠢的问题,但是有什么方法可以将一个布尔值转换为一个字符串,使得1变成“true”,0变成“false”?我可以只使用if语句,但很高兴知道是否有方法使用语言或标准库来实现这一点。另外,我是一个学生。 :)将bool转换为C++中的文本
回答
有关使用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;
我是C++的完全新手。有人可以向我解释这是如何工作的吗? – Chucky 2013-02-20 14:06:56
@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
我同意宏可能是最合适的。我刚刚刮起了测试用例(相信我,我没有很好的与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"
在该宏中需要一些括号,这可能是为什么你得到了downvote。 – postfuturist 2008-10-25 21:45:49
我用三元在一个printf像这样:
printf("%s\n", b?"true":"false");
如果宏是:
B2S(b) ((b)?"true":"false")
,那么你需要确保无论你在通过为'b'
没有按”没有任何副作用。不要忘记'b'
的括号,因为你可能会遇到编译错误。
由于'b'只在宏定义中出现一次,为什么要警告副作用? – postfuturist 2008-10-25 21:42:58
如果您决定使用宏(或在未来的项目中使用C),则应在宏扩展中的'b'周围添加括号(我没有足够的点数来编辑其他人的内容):
#define BOOL_STR(b) ((b)?"true":"false")
这是一个defensive programming技术,可以防止隐藏的操作顺序错误;即,如何评估所有编译器?
1 == 2 ? "true" : "false"
相比
(1 == 2) ? "true" : "false"
甚至在拥有de 2k代表之前,您实际上可以编辑其他人的内容。它会被审查,但当然你可以。 – SysDragon 2014-08-05 08:49:28
我们在谈论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?你一定在开玩笑?
耶稣哭了。
好的,你问了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是一个不可接受的瓶颈,当你应该考虑做一些宏观恐怖时,就是。
这应该是罚款:
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";
}
只要字符串可以直接作为字符数组它会被视为我很难说服std::string
将字符串表示为C++中的一等公民。
此外,结合分配和有界性似乎对我来说是一个坏主意。
这个帖子很旧,但现在你可以使用std::to_string
将很多变量转换为std::string
。
http://en.cppreference.com/w/cpp/string/basic_string/to_string
- 1. 在C/C++中将int转换为bool
- 2. C#如何将short []转换为bool []?
- 3. C++ 11 basic_istream转换为bool
- 4. OCaml:将bool转换为/ int
- 5. 将bool转换为QString
- 6. 将bool转换为int?
- 7. 将bool(false)转换为C++中的合法指针吗?
- 8. 如何安全地将System.Object转换为C#中的`bool`?
- 9. SQL [转换为bool]
- 10. 实体框架C#转换INT为bool
- 11. 将任意类约束`C a`转换为`C a Bool`
- 12. 将二进制文件转换为C中的文本文件
- 13. 无法将字符串转换为Bool
- 14. 帮助将bool转换为整数
- 15. 如何将JValue转换为bool?
- 16. 如何将类型bool转换为System.Windows.Forms.TextBox
- 17. 如何将std :: ostringstream转换为bool?
- 18. 将一个Int转换为Bool
- 19. 转换可为空bool? to bool
- 20. C++,bool转换总是回退到隐式转换为void *?
- 21. 将钱转换为PHP中的文本
- 22. 将BLOB转换为sql中的文本
- 23. 'bool'不能转换为'uint8'
- 24. 将文本转换为xml
- 25. 将html转换为文本
- 26. 将文本转换为PDF
- 27. 将文本转换为URL
- 28. 将文本转换为Varchar
- 29. 将csv转换为文本
- 30. 将文本转换为列
异议!本地化呢?为什么一种语言本身包含语言特定的文字常量? – valdo 2013-05-28 22:28:38
@valdo - 我非常肯定,对于我正在开展的项目,国际化不是问题。当时,这可能是一个学校项目。 – 2013-06-01 19:20:54