Ver Mensaje Individual
  #9 (permalink)  
Antiguo 20/09/2013, 10:03
Avatar de guzzano
guzzano
 
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 5 meses
Puntos: 13
Respuesta: duda con sub cadenas en programacion C

Aquí te dejo una solución, hecha rápida, puede hacerse mejor, ese trabajo te lo dejo a ti. Como el caso de no requerir espacios y que ruede los caracteres la misma función.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. char *
  5. p_strcat(dest, src, position, len)
  6.  
  7. char *dest;
  8. const char *src;
  9. unsigned int position;
  10. size_t len;
  11.  
  12. {
  13.   /* sanity check */
  14.   if (position < 0 || len <= 0 || position > len ||
  15.       strlen(dest)+strlen(src) > len)
  16.         return NULL;
  17.  
  18.   unsigned int i = 0;
  19.   unsigned int pos = 0;
  20.    
  21.   char * aux = dest;
  22.  
  23.   for (; *aux != '\0'; aux++, pos++)
  24.     if (pos == position) break;
  25.  
  26.   for (; src[i] != '\0' ; i++)
  27.   {
  28.     *aux = src[i];
  29.     aux++;
  30.   }
  31.   return dest;
  32. }
  33.  
  34. int
  35. main (int argc, char *argv[])
  36. {
  37.   char aux1[60] = "Mi nombre es:         de Venezuela.";
  38.   char aux2[8] = "Alberto";
  39.  
  40.   p_strcat(aux1, aux2, 14, sizeof(aux1));
  41.   puts(aux1);
  42.  
  43.   return 0;
  44. }

En la solución de efcisa, tiene unos errores y observaciones.

Código C:
Ver original
  1. char s1[100] = "Una vez.", s2[] = " sola opcion a la";

En la función, vas a pasar al final toda la cadena a s1 pero a esta la definiste solo el espacio de "Una vez."

Código C:
Ver original
  1. char *s3 = (char*) malloc(length);

malloc devuelve un puntero nulo, por lo cual no es necesario tener el case, si es por legibilidad es mejor

Código C:
Ver original
  1. char *s3 = malloc(sizeof(char)*length);
  2.  
  3.   if (s3 == NULL)
  4.     return;

Tiene otros errores, que seguro son con las funciones strcat y strcpy, a lo mejor porque no está especificado el caracteres final

Código test:
Ver original
  1. ==8453==
  2. ==8453== HEAP SUMMARY:
  3. ==8453==     in use at exit: 0 bytes in 0 blocks
  4. ==8453==   total heap usage: 1 allocs, 1 frees, 25 bytes allocated
  5. ==8453==
  6. ==8453== All heap blocks were freed -- no leaks are possible
  7. ==8453==
  8. ==8453== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 12 from 8)
  9. ==8453==
  10. ==8453== 1 errors in context 1 of 2:
  11. ==8453== Invalid read of size 1
  12. ==8453==    at 0x40086AD: strcpy (mc_replace_strmem.c:442)
  13. ==8453==    by 0x8048614: insert (in /home/guzzano/test)
  14. ==8453==    by 0x8048560: main (in /home/guzzano/test)
  15. ==8453==  Address 0x4028041 is 0 bytes after a block of size 25 alloc'd
  16. ==8453==    at 0x4007282: malloc (vg_replace_malloc.c:270)
  17. ==8453==    by 0x80485AD: insert (in /home/guzzano/test)
  18. ==8453==    by 0x8048560: main (in /home/guzzano/test)
  19. ==8453==
  20. ==8453==
  21. ==8453== 1 errors in context 2 of 2:
  22. ==8453== Invalid write of size 1
  23. ==8453==    at 0x4008321: strcat (mc_replace_strmem.c:267)
  24. ==8453==    by 0x8048602: insert (in /home/guzzano/test)
  25. ==8453==    by 0x8048560: main (in /home/guzzano/test)
  26. ==8453==  Address 0x4028041 is 0 bytes after a block of size 25 alloc'd
  27. ==8453==    at 0x4007282: malloc (vg_replace_malloc.c:270)
  28. ==8453==    by 0x80485AD: insert (in /home/guzzano/test)
  29. ==8453==    by 0x8048560: main (in /home/guzzano/test)
  30. ==8453==
  31. --8453--
  32. --8453-- used_suppression:     12 U1004-ARM-_dl_relocate_object
  33. ==8453==
  34. ==8453== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 12 from 8)

Saludos