2010-08-31 5 views
21

В настоящее время я читаю из ini-файла с помощью пары ключ/значение. т.е.C++ std :: string to boolean

isValid = true 

Когда получите пару ключ/значение, мне нужно, чтобы преобразовать строку «истина» к BOOL. Не используя 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 cos Я не знал о boolalpha. Обратите внимание, что boost :: lexical_cast (что делает то же самое) не очень прощает о случае либо – pm100

+0

, это действительно круто ... Я раньше не знал о 'std :: boolalpha' – rmeador

+0

Я пытался использовать это, но его высказывание, что преобразование не является частью std. Я включил Что я пропустил? – Wesley

0

Если вы не можете использовать импульс, попробуйте strcasecmp:

#include <cstring> 

std::string value = "TrUe"; 

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

'strcasecmp' не существует под Windows. – zneak

+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

Строчные строка итерируя строку и вызов tolower на carachters, а затем сравнить его с "true" или "false", если корпус - ваша единственная забота.

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

tolower() работает на одном символе, c_str() возвращает указатель на строку, которая не должна быть изменена. Так что эта идея на самом деле была бы вредной. –

+0

@ Uli Schlanchter Где, черт возьми, я понял, что он работал на струнах? Спасибо за уловку. – zneak

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

Смежные вопросы