2015-12-02 4 views
8

पर एक पॉइंटर लौटाएं, मुझे आश्चर्य है कि कोई मेरी मदद कर सकता है, मैं 3 स्ट्रिंग्स को संयोजित करने और नई स्ट्रिंग में पॉइंटर वापस करने की कोशिश कर रहा हूं। मुझे यह पता लगाना प्रतीत नहीं होता है कि स्ट्रैट के बजाए स्ट्रैटक और स्ट्रैस्पी के बजाय स्ट्रैंकैट का उपयोग करके इसे कैसे किया जाए। मैं केवल सी सीख रहा हूँ, इसलिए कोई मदद wil। बहुत अपमानित हो।3 स्ट्रिंग्स को संयोजित करें और नई स्ट्रिंग सी

char * 
concatenate(char *a, char *b, char *d) 
{ 
    char str[80]; 
    strcpy (str, a); 
    strcat (str,b); 
    strcat (str,d); 
    puts (str); 

    return (NULL); 
} 
+1

आप स्थानीय चर के पते को वापस कर देंगे, यह कोई अच्छा नहीं है। जैसे ही आप अपना फ़ंक्शन छोड़ देते हैं, वैरिएबल अस्तित्व में रहता है। एक आगे पैरामीटर जोड़ें जो सरणी को इंगित करता है जहां आप concattenation रखना चाहते हैं। –

+0

@ जेन्सगस्टेड, वह पोस्ट कोड में न्यूल लौट रहा है। –

+0

यह टाइपो था, मुझे एहसास हुआ और –

उत्तर

7

आप इसे इस तरह से नहीं कर सकते, तो आप एक स्थानीय सरणी अब वैध नहीं है कि एक बार समारोह रिटर्न, इसके अलावा, आप बफर अतिप्रवाह के लिए जांच नहीं करते के लिए सूचक लौट आते हैं।

#include <stdlib.h> 
#include <string.h> 

char *concatenate(const char *a, const char *b, const char *c) { 
    return strcat(strcat(strcpy(malloc(strlen(a) + strlen(b) + strlen(c) + 1, 
           a), b), c); 
} 

यहाँ memcpy उपयोग कर रहा है एक अधिक विस्तृत संस्करण:

#include <stdlib.h> 
#include <string.h> 

char *concatenate(const char *a, const char *b, const char *c) { 
    size_t alen = strlen(a); 
    size_t blen = strlen(b); 
    size_t clen = strlen(c); 
    char *res = malloc(alen + blen + clen + 1); 
    memcpy(res, a, alen); 
    memcpy(res + alen, b, blen); 
    memcpy(res + alen + blen, c, clen + 1); 
    return res; 
} 

इसके बाद से यह अतिरिक्त प्रदर्शन नहीं करता और अधिक कुशल होना चाहिए

यहां एक त्वरित और गंदे संस्करण है कि स्मृति आवंटित करता है स्कैन strcpy और strcat करते हैं, लेकिन केवल बेंचमार्किंग साबित कर सकती है कि यह उपरोक्त सरल संस्करण पर वास्तविक सुधार है या नहीं।

यदि आप एक मौजूदा बफर में 3 तार जोड़ की जरूरत है, एक बहुत ही सरल समाधान है:

char dest[DEST_SIZE]; 

snprintf(dest, sizeof dest, "%s%s%s", a, b, d); 
+0

बदल नहीं सकता है आपके पास तीसरा तर्क के रूप में 'const char * d' है, जिसका उपयोग आप – Alexguitar

+0

नहीं करते हैं आपकी सहायता के लिए धन्यवाद –

+0

मैं सभी मामलों में 'snprintf' समाधान पसंद करूंगा, यह अधिक पढ़ने योग्य –

5

आपका str अपने कार्य करने के लिए स्थानीय है।
आप अपने समेकित स्ट्रिंग में चौथा पैरामीटर जोड़ सकते हैं या आप इसे फ़ंक्शन के अंदर मॉलोक कर सकते हैं, बस इसे उपयोग के बाद मुक्त करना सुनिश्चित करें।

char *concatenate(char *a, char *b, char *c) 
{ 
    int size = strlen(a) + strlen(b) + strlen(c) + 1; 
    char *str = malloc(size); 
    strcpy (str, a); 
    strcat (str, b); 
    strcat (str, c); 

    return str; 
} 

int main(void) { 

    char *str = concatenate("bla", "ble", "bli"); 

    printf("%s", str); 
    free(str); 

    return 0; 
} 
+0

आपकी मदद के लिए धन्यवाद, strncpy और strncat का उपयोग करने की कोशिश कर रहा था। लेकिन इसे समझ नहीं सका लेकिन यह अपने स्वयं के –

+1

में मदद है 'strncpy' का उपयोग न करें, यह कभी सही उपकरण नहीं है। यदि आप दक्षता पर जोर देते हैं तो 'memcpy' का उपयोग करें। वापसी मूल्य को संश्लेषित न करें। – chqrlie

+0

इस उदाहरण में कोई कैसे memcpy का उपयोग करेगा ..? क्षमा करें मैं सिर्फ सी –

3

हो सकता है कि ऐसा ही कुछ:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

char * concatenate(const char *a, const char *b, const char *d) 
{ 
    /* calculate the length of the new string */ 
    size_t len = strlen(a) + strlen(b) + strlen(d); 
    /* allocate memory for the new string */ 
    char* str = malloc(len + 1); 

    /* concatenate */ 
    strcpy(str, a); 
    strcat(str, b); 
    strcat(str, d); 

    /* return the pointer to the new string 
    * NOTE: clients are responsible for releasing the allocated memory 
    */ 
    return str; 
} 

int main(void) 
{ 
    const char a[] = "lorem"; 
    const char b[] = "impsum"; 
    const char d[] = "dolor"; 
    char* str = concatenate(a, b, d); 

    printf("%s\n", str); 
    free(str); 

    return 0; 
} 
+0

सीख रहा हूं ओपी को पढ़ाने के लिए टिप्पणियां ठीक हैं। एक वास्तविक कार्यक्रम में, ऐसी टिप्पणियां स्पष्ट बताती रहेंगी। – chqrlie

3

आप कुछ और भी अधिक सामान्य (जैसे CONCATENATE एन तार) चाहते हैं, आप फिसलनदार पुस्तकालय यहाँ की g_strconcat के कार्यान्वयन के लिए देख सकते हैं: https://github.com/GNOME/glib/blob/master/glib/gstrfuncs.c#L563

+0

यह एपीआई दिलचस्प है लेकिन कुछ हद तक असंगत है, दस्तावेज के रूप में एक नई आवंटित खाली स्ट्रिंग के बजाय 'g_strconcat (NULL) 'वापसी' NULL' क्यों करता है? – chqrlie

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