2010-08-31 69 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