2010-08-31 14 views
21

Attualmente sto leggendo da un file ini con una coppia chiave/valore. vale a direC++ std :: string su booleano

isValid = true 

Quando ottenere la coppia chiave/valore che ho bisogno di convertire una stringa di 'vero' a un bool. Senza usare boost quale sarebbe il modo migliore per farlo?

So che posso confrontare una stringa sul valore ("true", "false") ma mi piacerebbe fare la conversione senza che la stringa nel file ini sia case sensitive.

Grazie

risposta

29

Un'altra soluzione potrebbe essere quella di utilizzare tolower() per ottenere una versione minuscola della stringa e quindi confrontare o utilizzare string-stream:

#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 bella risposta + un altro 1 cos non sapevo di boolalpha. Notare che boost :: lexical_cast (che fa lo stesso) non è molto clemente nel caso sia – pm100

+0

questo è veramente bello ... Non ero in precedenza consapevole di 'std :: boolalpha' – rmeador

+0

Ho provato ad usare questo ma il suo dire che trasforma non fa parte di std. Ho incluso Cosa mi sono perso? – Wesley

0

Se non è possibile utilizzare boost, provare strcasecmp:

#include <cstring> 

std::string value = "TrUe"; 

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

'strcasecmp' non esiste in Windows. – zneak

+1

Oh, andiamo! Sembra che un Boost sia l'unico modo per confrontare le stringhe :-) Ci sono modi molto più semplici ed efficienti per fare il cast lessicale, davvero. Soprattutto quando sai esattamente cosa stai facendo e non stai creando una libreria di conversione all-purpose-all-in-one. –

+0

@zneak - Windows ha "stricmp" (http://msdn.microsoft.com/en-us/library/k59z8dwe%28v=VS.80%29.aspx) –

0

Minuscolo la stringa iterando la stringa e chiamando tolower sulle carachters, poi confrontarlo con "true" o "false", se l'involucro è la tua unica preoccupazione.

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

tolower() funziona su un singolo carattere, c_str() restituisce un puntatore a una stringa che non deve essere modificata. Quindi questa idea sarebbe effettivamente dannosa. –

+0

@Uli Schlanchter Dove diavolo ho avuto l'idea che funzionasse con le stringhe? Grazie per la cattura. – 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; 
} 

Un esempio di input e 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 
$ 
+0

'strcasecmp' non è portabile. Alcune piattaforme usano 'stricmp', stranamente. – greyfade