2010-08-31 20 views
21

मैं वर्तमान में एक कुंजी/मूल्य जोड़ी के साथ एक आईएनआई फ़ाइल से पढ़ रहा हूं। अर्थातसी ++ std :: स्ट्रिंग टू बूलियन

isValid = true 

जब मुख्य/मान जोड़े मैं एक bool करने के लिए 'सही' के एक स्ट्रिंग बदलने की आवश्यकता हो। बढ़ावा देने के बिना ऐसा करने का सबसे अच्छा तरीका क्या होगा?

मुझे लगता है मैं तो एक स्ट्रिंग मान ("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 मुझे बुलाल्फा के बारे में पता नहीं था। ध्यान दें कि 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' विंडोज के तहत मौजूद नहीं है। – zneak

+1

ओह, चलो! यह लगता है कि एक बूस्ट तारों की तुलना करने के लिए एकमात्र तरीका है :-) वास्तव में लेक्सिकल कास्ट कर रहे हैं, तो सबसे आसान और कुशल तरीके हैं। विशेष रूप से जब आप जानते हैं कि आप वास्तव में क्या कर रहे हैं और एक ऑल-ऑब्जेक्ट-ऑल-इन-वन रूपांतरण लाइब्रेरी नहीं बना रहे हैं। –

+0

@zneak - विंडोज़ में "stricmp" है (http://msdn.microsoft.com/en-us/library/k59z8dwe%28v=VS.80%29.aspx) –

0

छोटे स्ट्रिंग पुनरावृत्ति और carachters पर tolower बुला, तो यह "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; 
} 

एक उदाहरण इनपुट और आउटपुट: सी पर केस-insenstive स्ट्रिंग comparisions ++ स्ट्रिंग्स के लिए

$ ./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

संबंधित मुद्दे