Al final si sacamos un patrón de todo esto es que se copian tantos caracteres como tenga la cadena más corta de las dos y el siguiente caracter tiene que ser el de fin de cadena '\0'.
Para los casos 2 y 3 vistos antes bastaría con hacer la modificación que ha comentado @Eternal Idol porque la cadena más corta es cadena2; sin embargo, en el caso 1 nos generará problemas de acceso a memoria.
Partiendo de:
Hola, estoy tratando de hacer una funcion que copia los caracteres de una string en otra. el funcionamiento es igual que el de la funcion strcpy() pero no puedo usarla.
No, el resultado del caso 1 esta mal, se deben copiar strlen de la cadena fuente + 1 (0 terminador). La funcion strcpy es insegura por naturaleza, si el buffer de destino no tiene suficiente espacio para copiar la fuente con su 0 terminador es un problema del llamador. Hay alternativas que reciben un tamaño maximo a usar como parametro ...
1) Copies the null-terminated byte string pointed to by src, including the null terminator, to the character array whose first element is pointed to by dest.
The behavior is undefined if the dest array is not large enough. The behavior is undefined if the strings overlap. The behavior is undefined if either dest is not a pointer to a character array or src is not a pointer to a null-terminated byte string.
https://en.cppreference.com/w/c/string/byte/strcpySeguramente las cadenas de destino en cuestion son simples arrays de caracteres donde anteriormente hubo informacion.
char b[128];
//b no es Adio, es Adios
PD. Tu codigo, al menos, no funciona bien con un buffer no inicializado (strlen sobre destino es un error logico) ni con uno vacio (solo copia el primer caracter de la cadena fuente y no el 0 terminador).