ваш цикл
for (i = 0; i < y; i++) {
string1[i+x]=string2[i];
}
вы читаете строку 2 вплоть до ее длины-1, которая будет считываться только до последнего символа перед NULL, если вы не знаете, в c или c ++ строки заканчиваются на NULL(0) символов.
Таким образом, ваша строка1 не будет иметь нулевого символа в конце.
Так что теперь, когда вы попытаетесь напечатать вашу строку1, она определенно напечатает некоторые символы в конце, так как ваша строка была размером 40, эти символы являются мусором.
В основном вы получите 40 символовВыводится строка, за исключением случаев, когда значение этих мусора равно 0.
Итак, вам следует прочитать вторую строку до 0, поэтому сделайте цикл
for (i = 0; i <= y; i++)
или вы можете просто добавить символ NULLв конце строки 1 после добавления в нее строки 2.
string1[x+y] = 0;