#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
 // se eu colocar que o vetor terá 20 caracteres, se eu digitar 21 dará um buffer overflow
 char *lastName = NULL;
 char *firstName = NULL;
 char *fullName = NULL;
 int pos;
 size_t tam1, tam2, tamanho;
 
 printf("Oi mundo!\n");
 
 // passando o scanf usando %ms, ele vai alocar na hora o tamanho necessário para guardar a string
 scanf("%ms", &firstName);
 scanf("%ms", &lastName);
 scanf("%d", &pos);
 
 printf("\nEntrada:\n%s - %lu chars\n%s - %lu chars\n%d\n", firstName, strlen(firstName), lastName, strlen(lastName), pos);
 
 // a função vai alocar o espaço para a nova string, sem mexer nas outras
 tam1 = strlen(firstName);
 tam2 = strlen(lastName);
 // +1 pro caractere \0 do final
 tamanho = tam1 + tam2 + 1;
 printf("Tamanho total fullName: %lu chars\n", tamanho);
 fullName = malloc(tamanho);
 // checa se pos é válido
 if (pos < 1 || pos > tam1) {
 	printf("Pos é inválido, não podemos continuar");
 } else {
  // copia o início da 1
  memcpy(fullName, firstName, pos);
  // copia os caracteres da 2 menos o 0
  memcpy(fullName + pos, lastName, tam2);
  // cpoia o resto da 1
  memcpy(fullName + pos + tam2, &firstName[pos], tam1 - pos);
  // será que precisa?
  fullName[tamanho - 1] = 0;
  printf("\nConcatenando:\n%s\n", fullName);
 }
 
 // depois de alocar dinamicamente, liberar a memória depois de usar
 free(firstName);
 free(lastName);
 free(fullName);
 
 return 0;
}
