#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Concatenates string1 and string2.
// Returns the concatenated (string1+string2), or NULL on errors.
// NOTE: Memory for the returned string is allocated with malloc()
// by the function, so the caller is responsible to release it with
// a call to free().
char *StringConcat(const char *string1, const char *string2)
{
char *stringResult;
size_t len1;
size_t len2;
// Check for NULL pointers...
// (Return NULL, or whatever your design is...)
if (string1 == NULL || string2 == NULL) {
return NULL;
}
// +1 for terminating NUL ('\0')
stringResult
= malloc(len1
+ len2
+ 1); if (stringResult == NULL) {
return NULL; // Allocation error
}
// Copy characters from first string
// (exclduing the terminating NUL --> len1)
memcpy(stringResult
, string1
, len1
);
// Copy characters from second string
// (including the terminating NUL --> len2+1)
memcpy(stringResult
+ len1
, string2
, len2
+1);
// Return destination string pointer to the caller.
// NOTE: Memory must be freed by the caller calling free().
return stringResult;
}
// *** TEST ***
int main(void)
{
// Test the function
char * str = StringConcat("Hello ", "World");
// Print the resulting string
// Don't forget to free() memory allocatd by the concat function
// All right
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLy8gQ29uY2F0ZW5hdGVzIHN0cmluZzEgYW5kIHN0cmluZzIuCi8vIFJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCAoc3RyaW5nMStzdHJpbmcyKSwgb3IgTlVMTCBvbiBlcnJvcnMuCi8vIE5PVEU6IE1lbW9yeSBmb3IgdGhlIHJldHVybmVkIHN0cmluZyBpcyBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKSAKLy8gYnkgdGhlIGZ1bmN0aW9uLCBzbyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIHJlbGVhc2UgaXQgd2l0aAovLyBhIGNhbGwgdG8gZnJlZSgpLgpjaGFyICpTdHJpbmdDb25jYXQoY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMikKewogICAgY2hhciAqc3RyaW5nUmVzdWx0OwogICAgc2l6ZV90IGxlbjE7CiAgICBzaXplX3QgbGVuMjsKICAgIAogICAgLy8gQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMuLi4KICAgIC8vIChSZXR1cm4gTlVMTCwgb3Igd2hhdGV2ZXIgeW91ciBkZXNpZ24gaXMuLi4pCiAgICBpZiAoc3RyaW5nMSA9PSBOVUxMIHx8IHN0cmluZzIgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgCiAgICBsZW4xID0gc3RybGVuKHN0cmluZzEpOwogICAgbGVuMiA9IHN0cmxlbihzdHJpbmcyKTsKICAgIAogICAgLy8gKzEgZm9yIHRlcm1pbmF0aW5nIE5VTCAoJ1wwJykKICAgIHN0cmluZ1Jlc3VsdCA9IG1hbGxvYyhsZW4xICsgbGVuMiArIDEpOwogICAgaWYgKHN0cmluZ1Jlc3VsdCA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7IC8vIEFsbG9jYXRpb24gZXJyb3IKICAgIH0KCiAgICAvLyBDb3B5IGNoYXJhY3RlcnMgZnJvbSBmaXJzdCBzdHJpbmcgICAgCiAgICAvLyAoZXhjbGR1aW5nIHRoZSB0ZXJtaW5hdGluZyBOVUwgLS0+IGxlbjEpCiAgICBtZW1jcHkoc3RyaW5nUmVzdWx0LCBzdHJpbmcxLCBsZW4xKTsKICAgIAogICAgLy8gQ29weSBjaGFyYWN0ZXJzIGZyb20gc2Vjb25kIHN0cmluZwogICAgLy8gKGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMIC0tPiBsZW4yKzEpCiAgICBtZW1jcHkoc3RyaW5nUmVzdWx0ICsgbGVuMSwgc3RyaW5nMiwgbGVuMisxKTsKCiAgICAvLyBSZXR1cm4gZGVzdGluYXRpb24gc3RyaW5nIHBvaW50ZXIgdG8gdGhlIGNhbGxlci4KICAgIC8vIE5PVEU6IE1lbW9yeSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgY2FsbGluZyBmcmVlKCkuCiAgICByZXR1cm4gc3RyaW5nUmVzdWx0Owp9CgoKLy8gKioqIFRFU1QgKioqCmludCBtYWluKHZvaWQpCnsKICAgIC8vIFRlc3QgdGhlIGZ1bmN0aW9uCiAgICBjaGFyICogc3RyID0gU3RyaW5nQ29uY2F0KCJIZWxsbyAiLCAiV29ybGQiKTsKICAgIAogICAgLy8gUHJpbnQgdGhlIHJlc3VsdGluZyBzdHJpbmcKICAgIHByaW50ZigiJXNcbiIsIHN0cik7CiAgICAKICAgIC8vIERvbid0IGZvcmdldCB0byBmcmVlKCkgbWVtb3J5IGFsbG9jYXRkIGJ5IHRoZSBjb25jYXQgZnVuY3Rpb24KICAgIGZyZWUoc3RyKTsKICAgIAogICAgLy8gQWxsIHJpZ2h0CiAgICByZXR1cm4gMDsKfQo=