c ++ std :: string для логического выражения - PullRequest
22 голосов
/ 01 сентября 2010

Я сейчас читаю из INI-файла с парой ключ / значение. т.е.

isValid = true

Когда я получаю пару ключ / значение, мне нужно преобразовать строку 'true' в bool. Без использования boost, что было бы лучшим способом сделать это?

Я знаю, что могу сравнить строку по значению ("true", "false"), но я бы хотел выполнить преобразование без учета строки в файле ini.

Спасибо

Ответы [ 5 ]

30 голосов
/ 01 сентября 2010

Другое решение - использовать 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");
2 голосов
/ 01 сентября 2010
#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 голосов
/ 01 сентября 2010

Предложения для сравнения строк без учета регистра в строках C ++ можно найти здесь: Сравнение строк без учета регистра в C ++

0 голосов
/ 01 сентября 2010

Выполните строчную строчку, выполнив итерацию строки и вызвав tolower для символов, затем сравните ее с "true" или "false", если регистр является вашей единственной задачей.

for (std::string::iterator iter = myString.begin(); iter != myString.end(); iter++)
    *iter = tolower(*iter);
0 голосов
/ 01 сентября 2010

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

#include <cstring>

std::string value = "TrUe";

bool isTrue = (strcasecmp("true",value.c_str()) == 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...