El problema no está en la concatenación de las cadenas, está en el tamaño de final. En primer lugar no puedes usar una variable en la declaración de final:
Tienes dos opciones, le colocas un tamaño fijo:
Código:
...
char final [1024];
...
o usas memoria dinámica
Código:
...
char *final = NULL;
final = malloc(n);
// tu codigo
free(final);
...
Y por último recuerda calcular bien el tamaño de la cadena...revisa eso y acuerdate del '\0' que va al final de todas las cadenas.
Saludos