我目前正在從一個帶有鍵/值對的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