2011-01-20 23 views
7

सी मैं strcpy इस्तेमाल किया एक तार का एक गहरी प्रतिलिपि बनाने के लिए, लेकिन यह अभी भी सी में strcpy उपयोग करने के लिए ++ या वहाँ बेहतर विकल्प है जो मैं बजाय का उपयोग करना चाहिए रहे हैं 'ठीक' है में?वैकल्पिक

+0

क्या आपकी स्ट्रिंग शून्य समाप्त हो गई है या नहीं? http://stackoverflow.com/q/4691608/176769 – karlphillip

उत्तर

14

सी ++ में आमतौर पर char * के बजाय std :: string class का उपयोग करना सबसे आसान तरीका है।

#include <string> 
... 
    std::string a = "Hello."; 
    std::string b; 
    b = a; 

रेखा "बी = ए;" वही काम करता है जो आप आमतौर पर स्ट्रैपी के साथ करते हैं।

+4

इसके अलावा, स्ट्रैपी सी ++ में कानूनी और खतरनाक है क्योंकि यह सी –

+0

में है इसलिए यह मूल रूप से * हमेशा * एक स्ट्रिंग को असाइन करते समय एक गहरी प्रति बनाता है एक और चर, ठीक है धन्यवाद :) – Aerus

+14

'std :: string''s' operator = 'वास्तव में एक गहरी प्रति नहीं करता है। यह संदर्भ प्रतिलिपि प्रतिलिपि करता है (और इस प्रकार, वास्तव में ऐसा नहीं करता है जो 'strcpy' करता है)। यदि आप 'std :: string' की गहरी प्रतिलिपि बनाना चाहते हैं, तो आपको इसे कॉल करने की आवश्यकता है:' std :: string a = "हैलो।"; std :: स्ट्रिंग बी; बी = a.c_str(); 'इसे पॉइंटर्स की प्रतिलिपि बनाने और संदर्भ गणना बढ़ाने के बजाय वास्तव में एक प्रतिलिपि बनाने के लिए मजबूर करना। –

3

आप C++ तार का उपयोग कर रहे हैं, तो बस प्रतिलिपि निर्माता का उपयोग करें:

std::string string_copy(original_string); 
असाइनमेंट ऑपरेटर

string_copy = original_string 

के

आप सी शैली तार (यानी अशक्त-समाप्त चार सरणियों उपयोग करना आवश्यक है), फिर हाँ, बस strcpy का उपयोग करें, या एक सुरक्षित विकल्प के रूप में, strncpy।

+0

आह अच्छा विकल्प, उस बारे में सोचा नहीं था :) – Aerus

2

आपको strcpy_s का उपयोग करने का सुझाव दिया जाता है क्योंकि गंतव्य और स्रोत तर्कों के अतिरिक्त, गंतव्य बफर के आकार के लिए अतिप्रवाह से बचने के लिए अतिरिक्त तर्क होता है। लेकिन यदि आप चार सरणी/पॉइंटर्स का उपयोग कर रहे हैं तो यह शायद स्ट्रिंग पर प्रतिलिपि बनाने का सबसे तेज़ तरीका है।

उदाहरण:

char *srcString = "abcd"; 
char destString[256]; 

strcpy_s(destString, 256, srcString); 
16

मैं ऊपर टिप्पणी में रखते, लेकिन सिर्फ कोड पठनीय बनाने के लिए:

std::string a = "Hello."; 
std::string b; 
b = a.c_str(); // makes an actual copy of the string 
b = a;   // makes a copy of the pointer and increments the reference count 

तो अगर आप वास्तव में strcpy के व्यवहार की नकल करना चाहते हैं, तो आप ' c_str() का उपयोग करके इसे कॉपी करने की आवश्यकता होगी;

अद्यतन

यह ध्यान देने योग्य है कि सी ++ 11 मानक स्पष्ट रूप से आम कॉपी-ऑन-राइट पैटर्न है कि std::string के कई प्रयोगों में पहले से इस्तेमाल किया गया था रोकता है। इस प्रकार, संदर्भ गिनती तारों की अब अनुमति नहीं है और निम्नलिखित एक प्रतिलिपि बनाएंगे:

std::string a = "Hello."; 
std::string b; 
b = a; // C++11 forces this to be a copy as well 
+0

मुझे नहीं लगता कि आप कह सकते हैं कि "c_str() 'एक प्रतिलिपि बनाता है": यह केवल कच्चे 'char *' डेटा को लौटाता है। यह डेटा तब std :: स्ट्रिंग कन्स्ट्रक्टर को पास किया जाता है जो वास्तविक प्रतिलिपि करता है। यदि इसकी प्रतिलिपि नहीं बनाई गई थी, तो बी को दायरे के रूप में जल्द ही अवैध कर दिया जाएगा या नष्ट कर दिया जाएगा। –

+1

मैंने नहीं कहा कि 'c_str()' एक प्रतिलिपि बनाता है। मैंने कहा 'बी = a.c_str()' स्ट्रिंग की एक प्रति बनाता है। 'c_str()' ऑपरेशन का केंद्र नहीं है; कॉपी-असाइनमेंट ऑपरेटर है। –

+0

मैंने प्रश्न को स्पष्ट करने के लिए एक संपादन के लिए कहा। कुछ भी गलत होने पर रोलबैक करने के लिए स्वतंत्र महसूस करें। –

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