fork(1) download
  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. int main(void) {
  7. // se eu colocar que o vetor terá 20 caracteres, se eu digitar 21 dará um buffer overflow
  8. char *lastName = NULL;
  9. char *firstName = NULL;
  10. char *fullName = NULL;
  11. int pos;
  12. size_t tam1, tam2, tamanho;
  13.  
  14. printf("Oi mundo!\n");
  15.  
  16. // passando o scanf usando %ms, ele vai alocar na hora o tamanho necessário para guardar a string
  17. scanf("%ms", &firstName);
  18. scanf("%ms", &lastName);
  19. scanf("%d", &pos);
  20.  
  21. printf("\nEntrada:\n%s - %lu chars\n%s - %lu chars\n%d\n", firstName, strlen(firstName), lastName, strlen(lastName), pos);
  22.  
  23. // a função vai alocar o espaço para a nova string, sem mexer nas outras
  24. tam1 = strlen(firstName);
  25. tam2 = strlen(lastName);
  26. // +1 pro caractere \0 do final
  27. tamanho = tam1 + tam2 + 1;
  28. printf("Tamanho total fullName: %lu chars\n", tamanho);
  29. fullName = malloc(tamanho);
  30. // checa se pos é válido
  31. if (pos < 1 || pos > tam1) {
  32. printf("Pos é inválido, não podemos continuar");
  33. } else {
  34. // copia o início da 1
  35. memcpy(fullName, firstName, pos);
  36. // copia os caracteres da 2 menos o 0
  37. memcpy(fullName + pos, lastName, tam2);
  38. // cpoia o resto da 1
  39. memcpy(fullName + pos + tam2, &firstName[pos], tam1 - pos);
  40. // será que precisa?
  41. fullName[tamanho - 1] = 0;
  42. printf("\nConcatenando:\n%s\n", fullName);
  43. }
  44.  
  45. // depois de alocar dinamicamente, liberar a memória depois de usar
  46. free(firstName);
  47. free(lastName);
  48. free(fullName);
  49.  
  50. return 0;
  51. }
  52.  
Success #stdin #stdout 0s 9424KB
stdin
12345
67890
2
stdout
Oi mundo!

Entrada:
12345 - 5 chars
67890 - 5 chars
2
Tamanho total fullName: 11 chars

Concatenando:
1267890345