यह भी पता है कि आपने देखा है कि वे वही करते हैं, या वह .data() कॉल .c_str(), यह मानना सही नहीं है कि यह अन्य कंपाइलरों के लिए होगा। यह भी संभव है कि आपका कंपाइलर भविष्य की रिलीज के साथ बदल जाएगा।
2 कारणों std :: स्ट्रिंग का उपयोग करना:
std :: स्ट्रिंग दोनों पाठ और मनमाने ढंग से बाइनरी डेटा के लिए इस्तेमाल किया जा सकता है।
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
आप .c_str() विधि का उपयोग करके ऐसी उदाहरण के रूप में अपने स्ट्रिंग का उपयोग कर रहे चाहिए 1.
आप .data() विधि का उपयोग करके ऐसी उदाहरण 2. नहीं के रूप में अपने स्ट्रिंग का उपयोग कर रहे चाहिए क्योंकि इन मामलों में .c_str() का उपयोग करना डरावना है, लेकिन क्योंकि यह अधिक स्पष्ट है कि आप अपने कोड की समीक्षा करने वाले अन्य लोगों के लिए बाइनरी डेटा के साथ काम कर रहे हैं।
.data()
निम्नलिखित कोड गलत है और अपने कार्यक्रम में एक segfault कारण बन सकता है का उपयोग कर के साथ संभावित ख़तरा:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
क्यों यह आम कार्यान्वयन .data बनाने के लिए के लिए है() और .c_str() वही काम करते हैं?
क्योंकि ऐसा करने के लिए यह अधिक कुशल है। .data() को कुछ ऐसा करने का एकमात्र तरीका जो निरस्त नहीं है, को .c_str() या .data() को उनके आंतरिक बफर की प्रतिलिपि बनाना होगा, या केवल 2 बफर का उपयोग करना होगा। एक एकल शून्य समाप्त बफर होने का मतलब हमेशा है कि आप std :: स्ट्रिंग को लागू करते समय हमेशा एक आंतरिक बफर का उपयोग कर सकते हैं।
स्रोत
2008-10-11 21:12:22
वास्तव में, .data के बिंदु() है कि यह आंतरिक बफर नकल नहीं करनी चाहिए है। इसका मतलब है कि कार्यान्वयन को जब तक इसकी आवश्यकता न हो तब तक एक char को बर्बाद नहीं करना पड़ेगा। आप कभी भी दो बफर नहीं चाहते हैं: यदि आप कॉल करते हैं .c_str(), बफर में \ 0 संलग्न करें। .data() अभी भी उस बफर को वापस कर सकता है। – MSalters
पूरी तरह से सहमत है यह 2 बफर का उपयोग करने के लिए हास्यास्पद होगा। आप कैसे जानते हैं कि यही कारण है कि डेटा का इरादा था? –
@ BrianR.Bondy मैं इस कोड की कोशिश की: ..ऑटो स्ट्र = स्ट्रिंग {"टेस्ट \ 0 स्ट्रिंग!" }; cout << "डेटा:" << str.data() << endl; आउटपुट "टेस्ट" है और पूरी स्ट्रिंग नहीं है, मैंने गलत क्या किया? – programmer