Ваш код не будет работать. Чтобы быть педантичным, он вызывает неопределенное поведение, потому что вы пытаетесь изменить содержимое строкового литерала.
char *str1 = "first";
char *str2 =" second";
str1
указывает на «первый», который находится в постоянной памяти.
Вместо того, чтобы иметь указатель на строковый литерал, вы должны иметь массив символов с достаточной емкостью для хранения объединенной строки "firstsecond"
Это работает согласно ожиданиям
#include <stdio.h>
int strcat2(char *s,char *t){
for(;*s!='\0';s++){
}
while((*s++ = *t++)!='\0'){
}
t='\0';
return 0;
}
int main(){
char str1[15] = "first";
char *str2 =" second";
strcat2(str1,str2);
printf("%s",str1);
return 0;
}
Онлайн демо здесь