2011-03-23 12 views
7

मेरे पास एक ऐसा फ़ंक्शन है जिसमें उस फ़ंक्शन में सी में char की सरणी में इनपुट और पॉइंटर है। मैं मुख्य स्ट्रिंग में हेरफेर कर रहा हूं, हालांकि मैं इसका उपयोग करने से पहले किसी अन्य चर में बैकअप प्रति बनाना चाहता हूं । मैं इसे चार बैकअप [2000] में रखना चाहता हूं, इसलिए यदि सूचक बदलता है तो बैकअप बदल नहीं जाएगा। मैं यह कैसे कर सकता हूं?एक स्ट्रिंग पॉइंटर की प्रति

+0

अपने कोड –

+0

पोस्ट करें एक समारोह strncpy बुलाया देखें। – GWW

+0

@GWW 'strncpy' एक घृणा है। यहां सही दृष्टिकोण यह सुनिश्चित करने के लिए स्ट्रिंग पर स्ट्रेल का उपयोग करना है कि यह बफर में फिट बैठता है, फिर स्ट्रैपी (बफर, स्ट्रिंग) या memcpy (बफर, स्ट्रिंग, लेन + 1) का उपयोग करें (बाद वाला कई आर्किटेक्चर पर तेज़ है)। –

उत्तर

11
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` 
} 
+4

POSIX स्ट्रड प्रदान करता है, जो आपके लिए malloc और strcpy करता है। –

0

आप strcpy का उपयोग अपने चार सरणी (स्ट्रिंग) की एक प्रतिलिपि बनाने के लिए इससे पहले कि आप को संशोधित करने शुरू कर सकते हैं।

1

strncpy() का उपयोग करें।

void myfunc(char* inputstr) 
{ 
    char backup[2000]; 
    strncpy(backup, inputstr, 1999); 
    backup[1999] = '\0'; 
} 

1 999 वर्णों को 2000 वर्ण सरणी में कॉपी करने से शून्य टर्मिनेटर के लिए अंतिम वर्ण छोड़ दिया जाता है।

+0

केवल तभी जब आप वास्तव में 'बैकअप [1 999] '0 0 सेट करते हैं। – Thanatos

+0

@ तानाटोस यदि 'इनपुटस्ट्र' की लंबाई 1 999 से कम है तो 'strncpy'' बैकअप 'स्ट्रिंग को नल के साथ पैड करेगा। लेकिन अच्छी बात ... इस मामले के लिए शून्य टर्मिनेटर की सेटिंग दिखाने के लिए संपादित किया गया है जहां लंबाई> = 1999. –

+1

strncpy एक घृणा है। कम से कम कैविट के बिना, इसे कभी भी अनुशंसा न करें। यह कि आपका मूल कोड बग्गी अनुमानित था, जैसा कि तथ्य था कि आपका संपादित कोड अभी भी कई अनियंत्रित एनयूएल स्टोर्स के साथ स्मृति को स्लैम करता है। इसके अलावा, आप स्थानीय स्मृति में संग्रहीत कर रहे हैं और फिर इसे छोड़कर - बेकार बेकार। और आपके पास स्थिरता की तीन प्रतियां होती हैं जब आपके पास केवल एक (Google DRY) होना चाहिए। ये सभी गरीब, गैर-व्यावसायिक प्रथाएं हैं। –

0

बैकअप बनाने के लिए memcpy का उपयोग करें।

char backup[2000]; 
char original[2000]; 

sprintf(original, "lovely data here"); 
memcpy(backup, original, 2000); 

char* orig_ptr = original; 
+0

विफल 'अगर स्ट्रेल (मूल)> 1 999', और "2000" के उन तीन उदाहरण खराब अभ्यास हैं। –

+0

उदाहरण इस विचार को प्रदर्शित करने के लिए है ... उत्पादन योग्य कोड नहीं –

+0

खराब प्रथाओं का उपयोग करने वाले उत्तर खराब उत्तरों हैं। –

0

strcpy reference.

strcpy(backup, source); 

लिंक से नोट।

ओवरफ्लो से बचने के लिए, गंतव्य द्वारा इंगित सरणी का आकार स्रोत के रूप में एक ही सी स्ट्रिंग को शामिल करने के लिए काफी लंबा होगा (स्रोत को समाप्त करने सहित), और स्रोत के साथ स्मृति में ओवरलैप नहीं होना चाहिए।

+0

तो एक उत्तर दें जो वास्तव में चेतावनी का पालन करता है। –

9

सी में तार डुप्लिकेट बनाने के लिए एक पुस्तकालय strdup बुलाया समारोह है कि के लिए बनाया है:

strdup द्वारा आबंटित स्मृति free का उपयोग कर उपयोग के बाद मुक्त किया जाना चाहिए।

strdup एक चरण में स्मृति आवंटन और स्ट्रिंग कॉपी ऑपरेशन प्रदान करता है। एक चार सरणी का उपयोग समस्याग्रस्त हो सकता है अगर किसी बिंदु पर स्ट्रिंग की प्रतिलिपि सरणी के आकार से बड़ी होती है।

+0

ओपी इसे एक सरणी –

+3

पर कॉपी करना चाहता है ठीक है, लेकिन शायद यह एक बेहतर विकल्प है जिसे उसने नहीं सोचा था कि क्या वह पहले से ही स्ट्रिंग की प्रतिलिपि बनाने के रूप में कुछ बुनियादी मांग रहा है। स्वीकृत उत्तर कुछ समान करता है। – jdehaan

+3

@ एंडी ओपी सी डायपर से भी बाहर नहीं है और यह नहीं पता कि सबसे अच्छा समाधान क्या है। यह एक मौलिक नियम है जिसे आपको सीखना चाहिए: समाधानों के अनुरोधों में अक्सर आवश्यकताओं के बजाय समय से पहले डिज़ाइन होता है। हमेशा सुनिश्चित करें कि ग्राहक उत्तरार्द्ध प्रदान करता है, पूर्व में नहीं। –

2

आपके मित्र निम्नांकित कार्य हैं

  • malloc
  • memset
  • calloc
  • memcpy
  • strcpy
  • strdup
  • strncpy

लेकिन सभी का सबसे अच्छा, सबसे बड़ी दोस्त आदमी :) है

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