Twój kod nie ma prawa zadziałać poprawnie, ponieważ dodajesz wartość liczbową znaków - element tablicy znaków, to wartość liczbowa z zakresu 0-255. Zapis str[i] = str[i]+str2[i] oznacza, że nowy znak ma kod sumy dwóch innych, zatem nic dziwnego, że program nie działa tak jak oczekujesz.
Powinieneś rozpocząć od końca pierwszego wyrazu i doklejać kolejne wyrazy. Problem jaki tutaj może wystąpić jest taki, że nie masz pewności, czy dana tablica pomieści sklejony wyraz - o to musisz zadbać w kodzie.
Twój kod może wyglądać tak:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
void dodaj(char *str)
{
char str2[]=" mieszka krasnoludek";
int i;
int len;
len = strlen(str);
for(i=0; str2[i]!=NULL; i++)
{
str[len+i] = str2[i];
}
}
int main()
{
char str[50]="Za gorami za lasami"; //celowo wieksza tablica, aby pomiescic sklejony wyraz
dodaj(str);
printf("%s", str);
return 0;
}