c++ - Convert std::string to char * in c++11 -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 8 जवाब
मैं एक पुस्तकालय के लिए लिख रहा हूँ मिश्रित-भाषाओं और इसलिए हमें सी इंटरफ़ेस पर रहना होगा। मुझे इस एपीआई फ़ंक्शन को कॉल करना होगा:
शून्य getproperty (const char * key, / * में * / char * value / * out * /) {
< P> मुझे मान को std :: string की सामग्री के साथ सेट करना होगा। std :: string stdString = funcReturningString (); // सेट मूल्य stdString
की सामग्री के लिए मैंने संभावित रणनीतियों पर बहुत सारे जवाब देख लिए हैं, लेकिन इस विशिष्ट उपयोग-मामले के लिए कोई नहीं है और न ही किसी भी "सर्वश्रेष्ठ" या "मानक" । " हम इसके मूल्य के लिए सी ++ 11 का इस्तेमाल कर रहे हैं। कुछ उत्तरों ने बफर को स्ट्रिंग की सामग्री की प्रतिलिपि बनाने और उस का उपयोग करने के लिए अस्पष्ट सिफारिश की है लेकिन इसे कैसे करें? मैं इस वार्तालाप पर कुछ और राय चाहूंगा ताकि मैं आखिरकार एक रणनीति चुन सकूं और इसके द्वारा खड़े हो जाओ।
धन्यवाद!
अद्यतनः यहां पर इसका समाधान है I
मैं अन्य API फ़ंक्शंस के अनुरूप रखने के लिए uint32_t का उपयोग कर रहा हूं। बफर साइज़ एक संदर्भ है क्योंकि फोरट्रान संदर्भ से सबकुछ कॉल करता है।
शून्य getproperty (const char * key, / * में * / const uint32_t & amp; बफ़र आकार, / * में * / char * मान, / * बाहर * / uint32_t और त्रुटि / * आउट * /) {std :: string stdString = funcReturningString (); अगर (बफर साइज़ & lt; str.size () + 1) {// त्रुटि कोड सेट करें, एक त्रुटि संदेश सेट करें, और वापसी} strcpy (value, stdString.c_str ()); }
मैंने सभी मानक को बनाए रखने के लिए strcpy () चुना है और मैंने एक बफर साइज़ पैरामीटर चुना है, ताकि मुझे टिप्पणियों में वर्णित डबल इंडिरेक्शन की कुछ समस्याओं के बारे में चिंता न करें।
ऐसा लगता है कि getproperty
API कॉल त्रुटिपूर्ण है। कॉलर को मान
की लंबाई बताए जाने का कोई तरीका नहीं है। इसका मतलब है कि getproperty
के कार्यान्वयन को सुरक्षित रूप से value
में नहीं लिख सकते हैं क्योंकि उसे पता नहीं है कि यह कितनी देर तक है। getproperty
विधि को या तो एक चार ** मान
लेने के लिए या मूल्य
बफर को एक पैरामीटर के रूप में लेने के लिए परिवर्तित करने की आवश्यकता है मान लीजिए कि बाद किया गया है
शून्य getproperty (const char * key, char * value, size_t valueLength);
अब funcReturningString
से लौटाए गए मान की सामग्री की प्रतिलिपि बनाने के लिए हमें बस strncpy
std :: string stdString = funcReturningString (); Strlcpy (मान, stdString.c_str (), valueLength);
ध्यान दें कि यह अभी भी दोषपूर्ण है। अगर valueLength == 0
या स्ट्रिंग की लंबाई से कम है, तो यह काम नहीं करेगा। getproperty
को बदलने के लिए शायद किसी भी प्रकार की त्रुटि कोड को वापस करने के लिए शायद सबसे अच्छा होना चाहिए, ताकि फोन करने वाले को इस तरह की विफलताओं को संप्रेषित किया जा सके
Comments
Post a Comment