tags:

views:

152

answers:

6

I am currently reading from an ini file with a key/value pair. i.e.

isValid = true

When get the key/value pair I need to convert a string of 'true' to a bool. Without using boost what would be the best way to do this?

I know I can so a string compare on the value ("true", "false") but I would like to do the conversion without having the string in the ini file be case sensitive.

Thanks

A: 

If you can't use boost, try strcasecmp:

#include <cstring>

std::string value = "TrUe";

bool isTrue = (strcasecmp("true",value.c_str()) == 0);
Andre Holzner
`strcasecmp` doesn't exist under Windows.
zneak
Oh, come on! It sounds like a Boost is the only way to go to compare strings :-) There are much more easiest and efficient ways then doing lexical cast, really. Especially when you know exactly what you are doing and not creating an all-purpose-all-in-one conversion library.
Vlad Lazarenko
@zneak - Windows has "stricmp" though (http://msdn.microsoft.com/en-us/library/k59z8dwe%28v=VS.80%29.aspx)
Vlad Lazarenko
strcmpi is POSIX standard, with the silly deprecation but still working behavior in Visual Studio.
Joel
`stricmp` is more widely used for case insensitive compare of C-style strings.
Eugen Constantin Dinca
A: 

Lowercase the string by iterating the string and calling tolower on the carachters, then compare it to "true" or "false", if casing is your only concern.

for (std::string::iterator iter = myString.begin(); iter != myString.end(); iter++)
    *iter = tolower(*iter);
zneak
tolower() works on a single character, c_str() returns a pointer to a string that must not be modified.So this idea would actually be harmful.
Uli Schlachter
@Uli Schlanchter Where the hell did I get the idea it worked on strings? Thanks for the catch.
zneak
+1  A: 
#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;
}

An example input and output:

$ ./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
$ 
Vlad Lazarenko
`strcasecmp` is non-portable. Some platforms use `stricmp`, strangely.
greyfade
A: 

Suggestions for case-insenstive string comparisions on C++ strings can be found here: http://stackoverflow.com/questions/11635/case-insensitive-string-comparison-in-c

Uli Schlachter
A: 

use bool::parse()

HPT
This is plain C++, not C++/CLI.
Georg Fritzsche
+5  A: 

Another solution would be to use tolower() to get a lower-case version of the string and then compare or use string-streams:

#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");
Georg Fritzsche
+1 nice answer + another 1 cos I did not know about boolalpha. Note that boost::lexical_cast (which does the same) is not very forgiving about case either
pm100
this is really cool... I was not previously aware of `std::boolalpha`
rmeador
I tried to use this but its saying that transform isnt part of std. I included <iostream> What did I miss?
Wesley
@Wesley: `#include <algorithm>`.
Georg Fritzsche
great, I got it working, thanks
Wesley