2008-08-27 102 views
65

也許這是一個愚蠢的問題,但是有什麼方法可以將一個布爾值轉換爲一個字符串,使得1變成「true」,0變成「false」?我可以只使用if語句,但很高興知道是否有方法使用語言或標準庫來實現這一點。另外,我是一個學生。 :)將bool轉換爲C++中的文本

+4

異議!本地化呢?爲什麼一種語言本身包含語言特定的文字常量? – valdo 2013-05-28 22:28:38

+0

@valdo - 我非常肯定,對於我正在開展的項目,國際化不是問題。當時,這可能是一個學校項目。 – 2013-06-01 19:20:54

回答

99

有關使用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; 
+0

我是C++的完全新手。有人可以向我解釋這是如何工作的嗎? – Chucky 2013-02-20 14:06:56

+3

@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

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

試試這個宏。任何你想要顯示「true」或false的地方,只需用PRINTBOOL(var)替換它,其中var是你想要的文本的布爾值。

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

在該宏中需要一些括號,這可能是爲什麼你得到了downvote。 – postfuturist 2008-10-25 21:45:49

1

我用三元在一個printf像這樣:

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

如果宏是:

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

,那麼你需要確保無論你在通過爲'b'沒有按」沒有任何副作用。不要忘記'b'的括號,因爲你可能會遇到編譯錯誤。

+0

由於'b'只在宏定義中出現一次,爲什麼要警告副作用? – postfuturist 2008-10-25 21:42:58

4

如果您決定使用宏(或在未來的項目中使用C),則應在宏擴展中的'b'周圍添加括號(我沒有足夠的點數來編輯其他人的內容):

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

這是一個defensive programming技術,可以防止隱藏的操作順序錯誤;即,如何評估所有編譯器?

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

相比

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

甚至在擁有de 2k代表之前,您實際上可以編輯其他人的內容。它會被審查,但當然你可以。 – SysDragon 2014-08-05 08:49:28

59

我們在談論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?你一定在開玩笑?

21

耶穌哭了。

好的,你問了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是一個不可接受的瓶頸,當你應該考慮做一些宏觀恐怖時,就是

6

這應該是罰款:


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

只要字符串可以直接作爲字符數組它會被視爲我很難說服std::string將字符串表示爲C++中的一等公民。

此外,結合分配和有界性似乎對我來說是一個壞主意。