2011-04-10 9 views
6

मेरे पास दो स्ट्रिंग्स, str1 और str2 हैं। मैं ढेर में एक जगह पर उनके साथ संयोजन करना चाहता हूँ। मैं का उपयोग कर उनके लिए अंतरिक्ष malloc:एक स्ट्रिंग के लिए malloc स्थान के लिए सही तरीका और फिर उस स्थान में अक्षर डालें?

char *concat = (char*) malloc(strlen(str1) + strlen(str2) + 1); 

मैं सिर्फ कर सकते हैं:

strcat(concat, str1); 
strcat(concat, str2); 

और concat मुझे concatted दो तार के साथ ढेर पर जगह दे देंगे? मैं पूछ रहा हूं क्योंकि ऐसा लगता है कि स्ट्रैट वास्तव में malloc का उपयोग करके आवंटित स्थान के अंत में str1 जोड़ देगा। क्या ये सही है? तो, फिर, str1 स्थिति strlen (str1) + strlen (str2) + 1.

कारण मैं पूछ रहा हूं कि मैं ऊपर की विधि का उपयोग कर रहा हूं, लेकिन मुझे valgrind में त्रुटि मिल रही है: सशर्त कूद या चाल uninitialised मूल्य (रों)

उत्तर

11

क्या strcat(dest, src) लेकिन वास्तव में ऐसा एक अशक्त बाइट dest से शुरू होकर आगे बढ़ते हुए, और फिर वहाँ src स्ट्रिंग लिखने के लिए खोज है।

malloc के बाद, स्मृति की सामग्री अपरिभाषित है, इसलिए आपका वर्तमान कोड किसी भी चीज को कर सकता है, उनमें से अधिकांश गलत हैं। यदि आप concat[0] = 0strcat से पहले करते हैं, तो आपका कोड काम करता है लेकिन str1 की लंबाई को तीन बार - strlen के लिए खोजना होगा, फिर पहले strcat के लिए, और दूसरे strcat के लिए अंतिम होगा।

इसके बजाय, हालांकि, मैं memcpy:

size_t len1 = strlen(str1), len2 = strlen(str2); 
char *concat = (char*) malloc(len1 + len2 + 1); 

memcpy(concat, str1, len1); 
memcpy(concat+len1, str2, len2+1); 

इस तथ्य यह है कि आप शुरू जहां दोनों तार के बाइट्स जाना चाहता हूँ से पता का लाभ लेता है, और कितने देखते हैं का उपयोग करें। त्रुटि जांच का उल्लेख करने के लिए

+0

+1 निश्चित रूप से ऐसा करने का एक बहुत अच्छा तरीका है। मैं शायद 'memcpy() 'की बजाय' memmove()' का उपयोग करता हूं, हालांकि, इस स्थिति में 'memcpy() 'सुरक्षित है, लेकिन यह हमेशा सुरक्षित नहीं है लेकिन' memmove()' हमेशा सुरक्षित है। –

+4

यहां 'memmove' का उपयोग न करें; यह भ्रमित करने वाला है। 'Memmove' के किसी भी उपयोग को दस्तावेज़ में कार्य करना चाहिए कि आप कुछ अलग और असामान्य कर रहे हैं। अगर मैंने यहां 'memmove' देखा है तो मैं यह समझने की कोशिश कर रहा हूं कि # * $ @ किसी ने इसका इस्तेमाल क्यों किया और यदि कुछ भी ख़राब हो रहा था ... –

4

पर निर्भर करता है आप एक strcpy और फिर एक strcat क्या करना चाहते हैं: ('\ 0') पता करने के लिए

strcpy(concat, str1); 
strcat(concat, str2); 

strcat वहाँ एक अशक्त टर्मिनेटर किया जा रहा है पर निर्भर करता है, जहां शुरू करने के लिए। यदि आप सिर्फ मॉलोक और स्ट्रैक करते हैं, तो यह कुछ ग़लत चीजें करने जा रहा है।

और नहीं, न तो स्ट्रैपी और न ही स्ट्रैट किसी भी तरह का आवंटन आवंटन या पुनर्वितरण करेगा।

4

मैं व्यक्तिगत रूप से निम्नलिखित करना होगा:

size_t length = strlen(str1) + strlen(str2) + 1; 
char *concat = malloc(sizeof(char) * length); 

if(concat == NULL) 
{ 
    // error 
} 

snprintf(concat, length, "%s%s", str1, str2); 
+0

+1। 'snprintf()' अक्सर एक अच्छा समाधान होता है, हालांकि यह यहां पर अधिक मात्रा में सीमाओं पर निर्भर करता है। –

+2

लंबाई गणना करने के लिए 'strlen' का उपयोग न करें। 'लंबाई = स्नप्रिंटफ़ (0,0, "% s% s", str1, str2) का उपयोग करें;' या बस 'asprintf' का उपयोग करें (और अपने स्वयं के संस्करण को शामिल करना सुनिश्चित करें - यह' snprintf' के आस-पास एक छोटा रैपर है - सिस्टम के लिए जिसमें इस जीएनयू एक्सटेंशन शामिल नहीं है)। –

+2

यहां स्वयं के ऊपर आर की टिप्पणी का औचित्य (सलाह को समझने के लिए पढ़ना चाहिए): http://stackoverflow.com/a/5615561/340236 – San

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