आप इसे इस तरह से नहीं कर सकते, तो आप एक स्थानीय सरणी अब वैध नहीं है कि एक बार समारोह रिटर्न, इसके अलावा, आप बफर अतिप्रवाह के लिए जांच नहीं करते के लिए सूचक लौट आते हैं।
#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);
आप स्थानीय चर के पते को वापस कर देंगे, यह कोई अच्छा नहीं है। जैसे ही आप अपना फ़ंक्शन छोड़ देते हैं, वैरिएबल अस्तित्व में रहता है। एक आगे पैरामीटर जोड़ें जो सरणी को इंगित करता है जहां आप concattenation रखना चाहते हैं। –
@ जेन्सगस्टेड, वह पोस्ट कोड में न्यूल लौट रहा है। –
यह टाइपो था, मुझे एहसास हुआ और –