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