#include <stdio.h> /* For printf() */
#include <stdlib.h> /* For malloc(), free() */
#include <string.h> /* For strcat(), strlen() */
/*
* Concatenates input strings into a single string.
* Returns the pointer to the resulting string.
* The string memory is allocated with malloc(),
* so the caller must release it using free().
* The input string array must have NULL as last element.
* If the input string array pointer is NULL,
* NULL is returned.
* On memory allocation error, NULL is returned.
*/
char * ConcatenateStrings(const char** strings)
{
int i = 0; /* Loop index */
int count = 0; /* Count of input strings */
char * result = NULL; /* Result string */
int totalLength = 0; /* Length of result string */
/* Check special case of NULL input pointer. */
if (strings == NULL)
{
return NULL;
}
/*
* Iterate through the input string array,
* calculating total required length for destination string.
* Get the total string count, too.
*/
while (strings[i] != NULL)
{
totalLength
+= strlen(strings
[i
]); i++;
}
count = i;
totalLength++; /* Consider NUL terminator. */
/*
* Allocate memory for the destination string.
*/
result
= malloc(sizeof(char) * totalLength
); if (result == NULL)
{
/* Memory allocation failed. */
return NULL;
}
/*
* Concatenate the input strings.
*/
for (i = 0; i < count; i++)
{
}
return result;
}
/*
* Tests the string concatenation function.
*/
int main(void)
{
/* Result of string concatenation */
char * result = NULL;
/* Some test string array */
const char * test[] =
{
"Hello ",
"world",
"!",
" ",
"Ciao ",
"mondo!",
NULL /* String array terminator */
};
/* Try string concatenation code. */
result = ConcatenateStrings(test);
/* Print result. */
/* Release memory allocated by the concatenate function. */
/* All right */
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgLyogRm9yIHByaW50ZigpICAgICAgICAgICAgICovCiNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qIEZvciBtYWxsb2MoKSwgZnJlZSgpICAgICAqLwojaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvKiBGb3Igc3RyY2F0KCksIHN0cmxlbigpICAgKi8KCgovKgogKiBDb25jYXRlbmF0ZXMgaW5wdXQgc3RyaW5ncyBpbnRvIGEgc2luZ2xlIHN0cmluZy4KICogUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIHN0cmluZy4KICogVGhlIHN0cmluZyBtZW1vcnkgaXMgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCksCiAqIHNvIHRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIGl0IHVzaW5nIGZyZWUoKS4KICogVGhlIGlucHV0IHN0cmluZyBhcnJheSBtdXN0IGhhdmUgTlVMTCBhcyBsYXN0IGVsZW1lbnQuCiAqIElmIHRoZSBpbnB1dCBzdHJpbmcgYXJyYXkgcG9pbnRlciBpcyBOVUxMLCAKICogTlVMTCBpcyByZXR1cm5lZC4KICogT24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IsIE5VTEwgaXMgcmV0dXJuZWQuCiAqLwpjaGFyICogQ29uY2F0ZW5hdGVTdHJpbmdzKGNvbnN0IGNoYXIqKiBzdHJpbmdzKQp7CiAgICBpbnQgaSA9IDA7ICAgICAgICAgICAgICAvKiBMb29wIGluZGV4ICAgICAgICAgICAgICAgKi8KICAgIGludCBjb3VudCA9IDA7ICAgICAgICAgIC8qIENvdW50IG9mIGlucHV0IHN0cmluZ3MgICAqLwogICAgY2hhciAqIHJlc3VsdCA9IE5VTEw7ICAgLyogUmVzdWx0IHN0cmluZyAgICAgICAgICAgICovCiAgICBpbnQgdG90YWxMZW5ndGggPSAwOyAgICAvKiBMZW5ndGggb2YgcmVzdWx0IHN0cmluZyAgKi8KICAgIAogCiAgICAvKiBDaGVjayBzcGVjaWFsIGNhc2Ugb2YgTlVMTCBpbnB1dCBwb2ludGVyLiAqLwogICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKICAgIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIAogICAgLyogCiAgICAgKiBJdGVyYXRlIHRocm91Z2ggdGhlIGlucHV0IHN0cmluZyBhcnJheSwKICAgICAqIGNhbGN1bGF0aW5nIHRvdGFsIHJlcXVpcmVkIGxlbmd0aCBmb3IgZGVzdGluYXRpb24gc3RyaW5nLgogICAgICogR2V0IHRoZSB0b3RhbCBzdHJpbmcgY291bnQsIHRvby4KICAgICAqLwogICAgd2hpbGUgKHN0cmluZ3NbaV0gIT0gTlVMTCkKICAgIHsKICAgICAgICB0b3RhbExlbmd0aCArPSBzdHJsZW4oc3RyaW5nc1tpXSk7CiAgICAgICAgaSsrOwogICAgfQogICAgY291bnQgPSBpOwogICAgdG90YWxMZW5ndGgrKzsgIC8qIENvbnNpZGVyIE5VTCB0ZXJtaW5hdG9yLiAqLwogICAgCiAgICAvKgogICAgICogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGVzdGluYXRpb24gc3RyaW5nLgogICAgICovCiAgICByZXN1bHQgPSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogdG90YWxMZW5ndGgpOwogICAgaWYgKHJlc3VsdCA9PSBOVUxMKSAKICAgIHsKICAgICAgICAvKiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAKICAgIC8qCiAgICAgKiBDb25jYXRlbmF0ZSB0aGUgaW5wdXQgc3RyaW5ncy4KICAgICAqLwogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIAogICAgewogICAgICAgIHN0cmNhdChyZXN1bHQsIHN0cmluZ3NbaV0pOwogICAgfQogICAgCiAgICByZXR1cm4gcmVzdWx0Owp9CgovKgogKiBUZXN0cyB0aGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gZnVuY3Rpb24uCiAqLwppbnQgbWFpbih2b2lkKQp7CiAgICAvKiBSZXN1bHQgb2Ygc3RyaW5nIGNvbmNhdGVuYXRpb24gKi8KICAgIGNoYXIgKiByZXN1bHQgPSBOVUxMOwogICAgCiAgICAvKiBTb21lIHRlc3Qgc3RyaW5nIGFycmF5ICovCiAgICBjb25zdCBjaGFyICogdGVzdFtdID0gCiAgICB7CiAgICAgICAgIkhlbGxvICIsCiAgICAgICAgIndvcmxkIiwKICAgICAgICAiISIsCiAgICAgICAgIiAiLAogICAgICAgICJDaWFvICIsCiAgICAgICAgIm1vbmRvISIsCiAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgYXJyYXkgdGVybWluYXRvciAqLwogICAgfTsKICAgIAogICAgLyogVHJ5IHN0cmluZyBjb25jYXRlbmF0aW9uIGNvZGUuICovCiAgICByZXN1bHQgPSBDb25jYXRlbmF0ZVN0cmluZ3ModGVzdCk7CiAgICAKICAgIC8qIFByaW50IHJlc3VsdC4gKi8KICAgIHByaW50ZigiJXNcbiIsIHJlc3VsdCk7CiAgICAKICAgIC8qIFJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgY29uY2F0ZW5hdGUgZnVuY3Rpb24uICovCiAgICBmcmVlKHJlc3VsdCk7CiAgICAKICAgIC8qIEFsbCByaWdodCAqLwogICAgcmV0dXJuIDA7Cn0K