Допустим, str1 = "ab", str2 = "cd", str3 = "ef"
strcat(str1, str2);
Это объединит str2 в str1, теперь str1 = "abcd"
strchr(str1, '\0');
// это ничего не сделает, просто вернет указатель '\ 0' в str1, который является последним chatracter.
sprintf(str1, "%s", str3);
это выведет "ef" в str1, старое содержимоебудет потеряно, я думаю, что вы хотели сделать
sprintf(<pointer returned from strchr>, "%s", str3);
strcpy(str4, str1);
Это просто скопирует str1 в str4.
puts(str4);
Это напечатает строку str4
Проблемас вашим кодом вы выполняете strchr, а не собираете возвращаемое значение, так что вы можете объединить его там.В этом случае strcpy и sprintf похожи, но sprintf предоставляет вам много вариантов форматирования, см. Документацию.http://www.cplusplus.com/reference/cstdio/sprintf/ Кроме того, ваш макрос MAX должен быть достаточно большим, чтобы содержать строки.