我目前正在从一个带有键/值对的ini文件中读取数据。即C++ std :: string到布尔值
isValid = true
当获得键/值对时,我需要将一个字符串'true'转换为布尔值。如果不使用boost,那么最好的方法是什么?
我知道我可以这样一个字符串比较的价值("true"
,"false"
),但我想做的转换,而不是ini文件中的字符串区分大小写。
感谢
我目前正在从一个带有键/值对的ini文件中读取数据。即C++ std :: string到布尔值
isValid = true
当获得键/值对时,我需要将一个字符串'true'转换为布尔值。如果不使用boost,那么最好的方法是什么?
我知道我可以这样一个字符串比较的价值("true"
,"false"
),但我想做的转换,而不是ini文件中的字符串区分大小写。
感谢
另一种解决方案将是使用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");
如果你不能使用boost,尝试strcasecmp
:
#include <cstring>
std::string value = "TrUe";
bool isTrue = (strcasecmp("true",value.c_str()) == 0);
在Windows下不存在'strcasecmp'。 – zneak 2010-08-31 21:25:28
哦,来吧!这听起来像是Boost是比较字符串的唯一方法:-)真的,在做词法分析时,有更简单有效的方法。特别是当你确切知道你在做什么,而不是创建一个全功能于一身的转换库。 – 2010-08-31 21:25:32
@zneak - Windows有“stricmp”虽然(http://msdn.microsoft.com/en-us/library/k59z8dwe%28v=VS.80%29.aspx) – 2010-08-31 21:27:35
小写形式的字符串是通过遍历字符串,并在carachters调用tolower
,然后把它比作"true"
或"false"
,如果套管是您唯一关心的问题。
for (std::string::iterator iter = myString.begin(); iter != myString.end(); iter++)
*iter = tolower(*iter);
tolower()对单个字符起作用,c_str()返回一个指向一个不能被修改的字符串的指针。 所以这个想法实际上是有害的。 – 2010-08-31 21:25:08
@Uli Schlanchter我到底知道它在字符串上起作用了吗?谢谢你的收获。 – zneak 2010-08-31 21:26:19
#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
$
'strcasecmp'是不可移植的。奇怪的是,有些平台使用'stricmp'。 – greyfade 2010-08-31 21:28:03
建议对C外壳-insenstive串comparisions ++字符串可以在这里找到: Case insensitive string comparison in C++
+1不错的答案+另一个1因为我不了解boolalpha。请注意,boost :: lexical_cast(这是相同的)是不是很宽容的案件要么 – pm100 2010-08-31 21:56:10
这真的很酷...我以前并没有意识到'std :: boolalpha' – rmeador 2010-08-31 21:57:45
我试图用这个,但它的说,转换不是标准的一部分。我包括我错过了什么? –
Wesley
2010-08-31 21:59:51