Количество ошибок в вашем коде приводит в уныние. Вы, вероятно, должны взять хорошую книгу C и начать все сначала.
Во-первых, есть библиотечная функция, которую вы можете использовать для объединения строк:
const unsigned int len = strlen(str1) + strlen(str2) + 1;
char * dst = malloc(len);
strncat(dst, str1, len);
strncat(dst, str2, len);
Теперь, если вы настаиваете на том, чтобы делать это вручную, вы должны правильно указывать и разыменовывать:
char * d = dst;
while (*str1 != 0) *dst++ = *str1++;
while (*str2 != 0) *dst++ = *str2++;
*dst = 0;
// d now points to the beginning of the concatenated string
Два цикла проверяют, является ли текущий символ во входной строке ненулевым, и если это так, то они копируют этот символ в текущий символ в выходной строке, а затем передаются и входной, и выходной указатели. (Все это делается за одну стирку с использованием оператора postfix ++
.) Наконец, последний символ устанавливается в ноль для создания нового нулевого терминатора.
В процессе мы изменили все три указателя dst
, str1
и str2
. Последние два пришли в качестве аргументов входной функции путем копирования, так что это нормально. Для возврата объединенной строки мы сделали копию dst
перед циклом, которую мы можем вернуть в конце.