मेरे पास एक ऐसा फ़ंक्शन है जिसमें उस फ़ंक्शन में सी में char की सरणी में इनपुट और पॉइंटर है। मैं मुख्य स्ट्रिंग में हेरफेर कर रहा हूं, हालांकि मैं इसका उपयोग करने से पहले किसी अन्य चर में बैकअप प्रति बनाना चाहता हूं । मैं इसे चार बैकअप [2000] में रखना चाहता हूं, इसलिए यदि सूचक बदलता है तो बैकअप बदल नहीं जाएगा। मैं यह कैसे कर सकता हूं?एक स्ट्रिंग पॉइंटर की प्रति
उत्तर
void function (const char *string)
{
char *stringcopy = malloc (1 + strlen (string));
if (stringcopy)
strcpy (stringcopy, string);
else fprintf (stderr, "malloc failure!"):
...
do whatever needs to be done with `stringcopy`
}
POSIX स्ट्रड प्रदान करता है, जो आपके लिए malloc और strcpy करता है। –
आप strcpy का उपयोग अपने चार सरणी (स्ट्रिंग) की एक प्रतिलिपि बनाने के लिए इससे पहले कि आप को संशोधित करने शुरू कर सकते हैं।
strncpy() का उपयोग करें।
void myfunc(char* inputstr)
{
char backup[2000];
strncpy(backup, inputstr, 1999);
backup[1999] = '\0';
}
1 999 वर्णों को 2000 वर्ण सरणी में कॉपी करने से शून्य टर्मिनेटर के लिए अंतिम वर्ण छोड़ दिया जाता है।
केवल तभी जब आप वास्तव में 'बैकअप [1 999] '0 0 सेट करते हैं। – Thanatos
@ तानाटोस यदि 'इनपुटस्ट्र' की लंबाई 1 999 से कम है तो 'strncpy'' बैकअप 'स्ट्रिंग को नल के साथ पैड करेगा। लेकिन अच्छी बात ... इस मामले के लिए शून्य टर्मिनेटर की सेटिंग दिखाने के लिए संपादित किया गया है जहां लंबाई> = 1999. –
strncpy एक घृणा है। कम से कम कैविट के बिना, इसे कभी भी अनुशंसा न करें। यह कि आपका मूल कोड बग्गी अनुमानित था, जैसा कि तथ्य था कि आपका संपादित कोड अभी भी कई अनियंत्रित एनयूएल स्टोर्स के साथ स्मृति को स्लैम करता है। इसके अलावा, आप स्थानीय स्मृति में संग्रहीत कर रहे हैं और फिर इसे छोड़कर - बेकार बेकार। और आपके पास स्थिरता की तीन प्रतियां होती हैं जब आपके पास केवल एक (Google DRY) होना चाहिए। ये सभी गरीब, गैर-व्यावसायिक प्रथाएं हैं। –
बैकअप बनाने के लिए memcpy का उपयोग करें।
char backup[2000];
char original[2000];
sprintf(original, "lovely data here");
memcpy(backup, original, 2000);
char* orig_ptr = original;
विफल 'अगर स्ट्रेल (मूल)> 1 999', और "2000" के उन तीन उदाहरण खराब अभ्यास हैं। –
उदाहरण इस विचार को प्रदर्शित करने के लिए है ... उत्पादन योग्य कोड नहीं –
खराब प्रथाओं का उपयोग करने वाले उत्तर खराब उत्तरों हैं। –
strcpy(backup, source);
लिंक से नोट।
ओवरफ्लो से बचने के लिए, गंतव्य द्वारा इंगित सरणी का आकार स्रोत के रूप में एक ही सी स्ट्रिंग को शामिल करने के लिए काफी लंबा होगा (स्रोत को समाप्त करने सहित), और स्रोत के साथ स्मृति में ओवरलैप नहीं होना चाहिए।
तो एक उत्तर दें जो वास्तव में चेतावनी का पालन करता है। –
सी में तार डुप्लिकेट बनाने के लिए एक पुस्तकालय strdup
बुलाया समारोह है कि के लिए बनाया है:
strdup
द्वारा आबंटित स्मृति free
का उपयोग कर उपयोग के बाद मुक्त किया जाना चाहिए।
strdup
एक चरण में स्मृति आवंटन और स्ट्रिंग कॉपी ऑपरेशन प्रदान करता है। एक चार सरणी का उपयोग समस्याग्रस्त हो सकता है अगर किसी बिंदु पर स्ट्रिंग की प्रतिलिपि सरणी के आकार से बड़ी होती है।
ओपी इसे एक सरणी –
पर कॉपी करना चाहता है ठीक है, लेकिन शायद यह एक बेहतर विकल्प है जिसे उसने नहीं सोचा था कि क्या वह पहले से ही स्ट्रिंग की प्रतिलिपि बनाने के रूप में कुछ बुनियादी मांग रहा है। स्वीकृत उत्तर कुछ समान करता है। – jdehaan
@ एंडी ओपी सी डायपर से भी बाहर नहीं है और यह नहीं पता कि सबसे अच्छा समाधान क्या है। यह एक मौलिक नियम है जिसे आपको सीखना चाहिए: समाधानों के अनुरोधों में अक्सर आवश्यकताओं के बजाय समय से पहले डिज़ाइन होता है। हमेशा सुनिश्चित करें कि ग्राहक उत्तरार्द्ध प्रदान करता है, पूर्व में नहीं। –
आपके मित्र निम्नांकित कार्य हैं
- malloc
- memset
- calloc
- memcpy
- strcpy
- strdup
- strncpy
लेकिन सभी का सबसे अच्छा, सबसे बड़ी दोस्त आदमी :) है
- 1. एक दृश्य की एक प्रति बनाना?
- 2. प्रति तालिका एक प्रति या एक कार्यात्मक खंड प्रति एक?
- 3. एक नल पॉइंटर
- 4. फंक्शन पॉइंटर जो एक फ़ंक्शन पॉइंटर
- 5. पॉइंटर
- 6. सी ++: एक बेस क्लास पॉइंटर
- 7. ServletContext प्रति वेब-ऐप या प्रति JVM प्रति एक है?
- 8. प्रारंभकर्ताओं को एक पॉइंटर
- 9. एक एसटीडीआईएन फ़ाइल की एक प्रति को कैसे खराब करें?
- 10. एक पायथन फ़ंक्शन की एक प्रति कैसे बनाएं
- 11. एंड्रॉइड: क्या एक दृश्य की एक प्रति बनाना संभव है?
- 12. एक नंगे भंडार की एक कार्य प्रति प्राप्त करना
- 13. सिद्धांत रिकॉर्ड की गहरी प्रति
- 14. UIBezierPath की स्वतंत्र प्रति बनाएं?
- 15. प्रति थ्रेड एक SQLiteConnection?
- 16. पॉइंटर-टू-पॉइंटर
- 17. पॉइंटर
- 18. एक 'पॉइंटर' लौटा रहा है जिसे स्मार्ट पॉइंटर
- 19. फ़ंक्शन पॉइंटर बनाएं जो एक फ़ंक्शन पॉइंटर को
- 20. फ़ोरट्रान पॉइंटर को एक लक्ष्य की आवश्यकता क्यों होती है?
- 21. स्ट्रिंग्स की एक सरणी के लिए मार्शलिंग पॉइंटर
- 22. स्ट्रिंग की एक सूची JSONResult
- 23. पॉइंटर
- 24. एक फ़ंक्शन पॉइंटर पिन करें
- 25. गणना एक स्ट्रिंग दिखाए जाने की एक स्ट्रिंग
- 26. एक और स्ट्रिंग के साथ एक-स्ट्रिंग की जगह
- 27. वाक्यांशों की पंक्तियों के लिए [प्रति पंक्ति एक शब्द] में शामिल हों [प्रति पंक्ति एकाधिक शब्द]
- 28. क्या यह एक शून्य * पॉइंटर
- 29. सी ++ कक्षा प्रतिलिपि (सूचक प्रति)
- 30. वेक्टर पॉइंटर स्थानों की गारंटी है?
अपने कोड –
पोस्ट करें एक समारोह strncpy बुलाया देखें। – GWW
@GWW 'strncpy' एक घृणा है। यहां सही दृष्टिकोण यह सुनिश्चित करने के लिए स्ट्रिंग पर स्ट्रेल का उपयोग करना है कि यह बफर में फिट बैठता है, फिर स्ट्रैपी (बफर, स्ट्रिंग) या memcpy (बफर, स्ट्रिंग, लेन + 1) का उपयोग करें (बाद वाला कई आर्किटेक्चर पर तेज़ है)। –