2009-10-07 16 views
15

मैं कभी भी std::string::data() पर std::string::c_str() पर कॉल क्यों करना चाहूंगा? निश्चित रूप से यहां मानक पागलपन के लिए कुछ विधि है ...std :: string :: c_str और std :: string :: डेटा के बीच क्या अंतर है?

+5

बस यह इंगित करना चाहते हैं कि सी ++ [सी ++ 11 या सी ++ 0x या जो भी आप इसे कॉल करना चाहते हैं) के अगले संस्करण में, दोनों कार्य परिभाषा के समानार्थी हैं। –

उत्तर

18

c_str() एनयूएल समाप्ति की गारंटी देता है। डेटा() नहीं करता है।

+0

मुझे लगा कि यह कुछ आसान होगा जिसे मैंने अनदेखा किया - धन्यवाद! – fbrereto

+1

हकीकत में हालांकि, वे शायद एक ही बात को इंगित करते हैं (ऐसा नहीं कि आपको इस पर भरोसा करना चाहिए)। – Zifre

+6

@Zifre: वे एक ही पते पर इंगित कर सकते हैं, लेकिन एक उत्परिवर्ती ऑपरेशन (str + = "...") के बाद, कार्यान्वयन शून्य डेटा समाप्ति के बिना आंतरिक डेटा बफर छोड़ सकता है, और केवल '\ 0' जोड़ सकता है c_str() विधि कहा जाता है। –

5

c_str() एक एनयूएल बाइट के साथ डेटा में एक सूचक लौटाता है ताकि आप वापसी मूल्य का उपयोग "सी स्ट्रिंग" के रूप में कर सकें।

डेटा() किसी भी संशोधन के बिना डेटा में एक सूचक देता है।

c_str() का उपयोग करें यदि आप जिस कोड का उपयोग कर रहे हैं, वह एक स्ट्रिंग मानता है एनयूएल समाप्त होता है (जैसे सी स्ट्रिंग को संभालने के लिए लिखा गया कोई भी फ़ंक्शन)।

1

एमएस एसटीएल 10.0 में अब कोई अंतर हो प्रतीत नहीं होता है, जैसा कि मैंने शीर्षक में इस देखें:

... \ माइक्रोसॉफ्ट विजुअल स्टूडियो 10.0 \ कुलपति \ शामिल \

const _Elem *c_str() const 
    { // return pointer to null-terminated nonmutable array 
    return (_Myptr()); 
    } 

const _Elem *data() const 
    { // return pointer to nonmutable array 
    return (c_str()); 
    } 
xstring

तो वे वही चीज़ लौटते हैं।

+0

ऐसा लगता है कि यह वीसी 9.0 में भी वही है। –

+0

यह व्यवहार है जो वर्तमान मानक द्वारा अनुमत है, और अगले के द्वारा आवश्यक है। मुझे संदेह है कि ज्यादातर पुस्तकालयों ने बदलाव की तैयारी में थोड़ी देर के लिए ऐसा कर रहे हैं। –

+0

धन्यवाद डेनिस। –

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