2010-08-31 73 views
21

我目前正在從一個帶有鍵/值對的ini文件中讀取數據。即C++ std :: string到布爾值

isValid = true 

當獲得鍵/值對時,我需要將一個字符串'true'轉換爲布爾值。如果不使用boost,那麼最好的方法是什麼?

我知道我可以這樣一個字符串比較的價值("true","false"),但我想做的轉換,而不是ini文件中的字符串區分大小寫。

感謝

回答

29

另一種解決方案將是使用tolower()以獲取字符串的小寫字母版本,然後比較或使用字符串流:

#include <sstream> 
#include <string> 
#include <iomanip> 
#include <algorithm> 
#include <cctype> 

bool to_bool(std::string str) { 
    std::transform(str.begin(), str.end(), str.begin(), ::tolower); 
    std::istringstream is(str); 
    bool b; 
    is >> std::boolalpha >> b; 
    return b; 
} 

// ... 
bool b = to_bool("tRuE"); 
+1

+1不錯的答案+另一個1因爲我不瞭解boolalpha。請注意,boost :: lexical_cast(這是相同的)是不是很寬容的案件要麼 – pm100 2010-08-31 21:56:10

+0

這真的很酷...我以前並沒有意識到'std :: boolalpha' – rmeador 2010-08-31 21:57:45

+0

我試圖用這個,但它的說,轉換不是標準的一部分。我包括我錯過了什麼? – Wesley 2010-08-31 21:59:51

0

如果你不能使用boost,嘗試strcasecmp

#include <cstring> 

std::string value = "TrUe"; 

bool isTrue = (strcasecmp("true",value.c_str()) == 0); 
+0

在Windows下不存在'strcasecmp'。 – zneak 2010-08-31 21:25:28

+1

哦,來吧!這聽起來像是Boost是比較字符串的唯一方法:-)真的,在做詞法分析時,有更簡單有效的方法。特別是當你確切知道你在做什麼,而不是創建一個全功能於一身的轉換庫。 – 2010-08-31 21:25:32

+0

@zneak - Windows有「stricmp」雖然(http://msdn.microsoft.com/en-us/library/k59z8dwe%28v=VS.80%29.aspx) – 2010-08-31 21:27:35

0

小寫形式的字符串是通過遍歷字符串,並在carachters調用tolower,然後把它比作"true""false",如果套管是您唯一關心的問題。

for (std::string::iterator iter = myString.begin(); iter != myString.end(); iter++) 
    *iter = tolower(*iter); 
+0

tolower()對單個字符起作用,c_str()返回一個指向一個不能被修改的字符串的指針。 所以這個想法實際上是有害的。 – 2010-08-31 21:25:08

+0

@Uli Schlanchter我到底知道它在字符串上起作用了嗎?謝謝你的收穫。 – zneak 2010-08-31 21:26:19

2
#include <string> 
#include <strings.h> 
#include <cstdlib> 
#include <iostream> 

bool 
string2bool (const std::string & v) 
{ 
    return !v.empty() && 
     (strcasecmp (v.c_str(), "true") == 0 || 
     atoi (v.c_str()) != 0); 
} 

int 
main() 
{ 
    std::string s; 
    std::cout << "Please enter string: " << std::flush; 
    std::cin >> s; 
    std::cout << "This is " << (string2bool (s) ? "true" : "false") << std::endl; 
} 

一個例子的輸入和輸出:

$ ./test 
Please enter string: 0 
This is false 
$ ./test 
Please enter string: 1 
This is true 
$ ./test 
Please enter string: 3 
This is true 
$ ./test 
Please enter string: TRuE 
This is true 
$ 
+0

'strcasecmp'是不可移植的。奇怪的是,有些平臺使用'stricmp'。 – greyfade 2010-08-31 21:28:03