2010-11-17 20 views
20

संभव डुप्लिकेट:
Convert std::string to const char* or char*std :: string को const char * में कैसे परिवर्तित करें?

void Foo::bar(const std::string& foobar) { 
    // ... 
    const char* foobar2 = (char*)foobar; 
    // ... 
} 

काम नहीं करता है यही कारण है कि और मैं अमान्य कास्टिंग के बारे में संकलन के दौरान कोई त्रुटि मिलती है।

वहाँ किसी और तरीके से const char* को std::string कन्वर्ट करने के लिए है?

+0

आप ऐसा क्यों करना चाहते हैं? – GManNickG

+1

@GMan: कारणों के बहुत सारे कारण हैं, मुख्य व्यक्ति सी सी एपीआई में फ़ंक्शंस का आह्वान कर रहा है? –

+2

@Gman क्योंकि मुझे foobar वैरिएबल को UDT के inet_pton फ़ंक्शन में पास करने की आवश्यकता है जो केवल चार * प्रकार चर लेता है। –

उत्तर

10

std::string::c_str() आपको एक वर्ण श्रृंखला में const char* पॉइंटर मिलता है जो स्ट्रिंग (शून्य-समाप्त) का प्रतिनिधित्व करता है।

आप इस सूचक अंक के डेटा में हेरफेर नहीं करना चाहिए, इसलिए यदि आप ऐसा करने की जरूरत है, डेटा की प्रतिलिपि।

डबल संपादित करें - यह एक अधिक सी ++ फैशन में कर

चूंकि यह अच्छे है कच्चे संकेत और एरे के प्रयोग से बचने के लिए जहां संभव हो, तब भी आप डेटा एक std::vector<char>

#include <string> 
#include <vector> 

int main() 
{ 
    std::string str = "Hello"; 
    std::vector<char> cvec(str.begin(), str.end()); 

    // do stuff 
} 
में प्राप्त कर सकते हैं के बाद से यह कच्चे संकेत का उपयोग करता

संपादित इस अधिक सी की तरह है और स्पष्ट रूप से मेम

#include <string> 
#include <cstring> 

int main() 
{ 
    std::string str = "Hello"; 
    char *cptr = new char[str.size()+1]; // +1 to account for \0 byte 
    std::strncpy(cptr, str.c_str(), str.size()); 

    // do stuff... 
    delete [] cptr; 
} 
आवंटित
+3

'std :: vector' का प्रयोग करें, कभी भी 'नया टी []' का उपयोग न करें। – GManNickG

+0

@GMan - धन्यवाद - जब मैं एक प्रश्न पॉइंटर्स के बारे में पूछता हूं तो मैं हमेशा सी-स्टाइल व्यवहार के लिए डिफ़ॉल्ट हूं, हालांकि सी ++ भूमि में मुझे पता है कि मुझे सी ++ - स्तर की सामग्री के साथ पहले पढ़ाना चाहिए। – birryree

+0

क्यों 'strncpy' और' strcpy' नहीं? – i486

3
const char* foobar2 = foobar.c_str(); 

सूचना स्थिरांक:

आप इस लिंक उपयोगी हो सकता है। अन्यथा आपको इसे चार बफर में कॉपी करना होगा।

4

आप str.c_str() के बारे में यहाँ गलत थोड़े जवाब का एक बहुत प्राप्त करने के लिए जा रहे हैं। :) जबकि c_str() वास्तव में उपयोगी है, कृपया ध्यान रखें कि यह एक char* में स्ट्रिंग परिवर्तित वास्तव में नहीं होगा, बल्कि एक const char* के रूप में स्ट्रिंग की सामग्री को वापस। और यह एक बड़ा अंतर है!

यहाँ क्या महत्वपूर्ण है कि सूचक आप c_str() से प्राप्त केवल तब तक दिया string वस्तु मौजूद है के रूप में मान्य है। तो यह होगा बहुत गलत:

class Something { 
    const char* name; 
public: 
    Something(const std::string& pname) { 
     this->name = pname.c_str(); /* wrong! the pointer will go wrong as the object from the parameter ceases to exist */ 
    } 
}; 

तो अगर आप के रूप में, कनवर्ट करना चाहते हैं: एक नया मान जो मूल std::string से स्वतंत्र हो जाएगा बनाने के लिए, तो आप की तरह कुछ करने के लिए चाहता हूँ इस:

char* convert(const std::string& str) { 
    char* result = new char[str.length()+1]; 
    strcpy(result,str.c_str()); 
    return result; 
} 

लेकिन फिर भी c_str() काफी ज्यादातर मामलों में आप के लिए पर्याप्त होगा।बस वस्तुओं के जीवन के समय के बारे में सोचने की कोशिश करें।

+2

'str.length() + 1' होना चाहिए क्योंकि लंबाई शून्य बाइट की गणना नहीं करती है। – birryree

+2

'std :: vector' का प्रयोग करें, कभी भी 'नया टी []' का उपयोग न करें। – GManNickG

+0

@birryree - यह सही है! धन्यवाद। – Kos

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