fork(1) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char *ft_strcpy(char *dst, const char *src) {
  5. int i = -1;
  6. do {
  7. i++;
  8. dst[i] = src[i];
  9. } while (src[i]);
  10. return dst;
  11. }
  12.  
  13. int ft_strlen(const char *src) {
  14. int i = 0;
  15. while (src[i]) i++;
  16. return i;
  17. }
  18.  
  19. char *ft_concat_params(int argc, char **argv) {
  20.  
  21. // Cache com os tamanhos das strings.
  22. int *cache = (int *) malloc(argc * sizeof(int));
  23.  
  24. // Conta o tamanho das strings.
  25. int count = 1; // 1 = espaço do terminador nulo.
  26. for (int i = 0; i < argc; i++) {
  27. cache[i] = ft_strlen(argv[i]);
  28. count += cache[i];
  29. }
  30.  
  31. // Cria a nova string que será retornada.
  32. char *newString = (char *) malloc(count);
  33.  
  34. // Copia as strings para o newString.
  35. // Usa aux para percorrer o espaço de memória de newString.
  36. char *aux = newString;
  37. for (int i = 0; i < argc; i++) {
  38. ft_strcpy(aux, argv[i]);
  39. aux = &(aux[cache[i]]);
  40. }
  41.  
  42. // Adiciona o terminador nulo.
  43. aux[0] = 0;
  44.  
  45. // Não precisamos mais da cache.
  46. free(cache);
  47.  
  48. // Terminamos.
  49. return newString;
  50. }
  51.  
  52. int main(void) {
  53. const char *strings1[] = {"banana", "pera", "uva"};
  54. char *a = ft_concat_params(3, strings1);
  55. printf("[%s] - %d\n", a, ft_strlen(a));
  56. free(a);
  57.  
  58. const char *strings2[] = {"", "teste", "", "mais", "", "perigoso", ""};
  59. char *b = ft_concat_params(7, strings2);
  60. printf("[%s] - %d\n", b, ft_strlen(b));
  61. free(b);
  62.  
  63. const char *strings3[] = {"", "", ""};
  64. char *c = ft_concat_params(3, strings3);
  65. printf("[%s] - %d\n", c, ft_strlen(c));
  66. free(c);
  67.  
  68. const char *strings4[] = {};
  69. char *d = ft_concat_params(0, strings4);
  70. printf("[%s] - %d\n", d, ft_strlen(d));
  71. free(d);
  72.  
  73. return 0;
  74. }
  75.  
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
[bananaperauva] - 13
[testemaisperigoso] - 17
[] - 0
[] - 0