Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Curioso0078 en 15 Marzo 2017, 19:27 pm



Título: Concatenacion de texto mediante puntero - Problema
Publicado por: Curioso0078 en 15 Marzo 2017, 19:27 pm
Hola, como estan? Tengo el siguiente problema. Tengo una funcion que dada dos cadenas, debe de concatenarlas, el problema empieza es que me devuelve cualquier cosa, muchos espacios en blanco.
Código
  1. struct textoenstruct;
  2.  
  3. typedef textoenstruct *puntero_a_struct;
  4.  
  5. struct textoenstruct {
  6.  char caracteres[21];
  7.  nat longitud;
  8. };
  9.  
  10. puntero_a_struct concatenar_texto(puntero_a_struct t1, puntero_a_struct t2) {
  11. puntero_a_struct final = new textoenstruct[strlen(t1 ->caracteres)+strlen(t2 ->caracteres)];
  12. strcat(final->caracteres, t1 ->caracteres);
  13. strcat(final->caracteres, t2 ->caracteres);
  14. /* si es mayor a 20 eliminar todo el resto */
  15. if ((strlen(t1 ->caracteres)+strlen(t2 ->caracteres)) > 20) {
  16.  
  17. for(int i = 20;i <= strlen(final->caracteres);i++) {
  18. final->caracteres[i] = '\0';
  19.  
  20. } }
  21.  
  22. return final;
  23. }
Tengo que hacerla mediante punteros, es un tema que me cuesta mucho(memoria dinamica). Esto es lo que hace la funcion:

Creo "textoenstruct" mediante new, el cual tiene de longitud (strlen(t1 ->caracteres)+strlen(t2 ->caracteres)), ya que los estoy concatenando (Pero tambien concatena el espacio en blanco) lo cual, ahora que lo pienso, contradice el concepto de memoria dinamica
ya que le estoy asignando un tamaño estatico, luego digo que en caso que la longitud del vector sea mayor a 20, coloque todos los caracteres posteriores como "\0" ya que esto seria como que estuvieran borrados cierto?
Entonces tengo un nuevo vector con los primeros 20 elementos del texto concatenado, pero en la practica el resultado es diferente, tiene muchos espacios en blanco

Y con esta linea asi como esta, el programa no compila:
Código
  1. for(int i = 20;i <= strlen(final->caracteres);i++)
  2.  
Nop entiendo cual es el problema de colocar esto asi


Título: Re: Concatenacion de texto mediante puntero - Problema
Publicado por: MAFUS en 15 Marzo 2017, 20:58 pm
No debes hacer
Código
  1. strcat(final->caracteres, t1 ->caracteres);
porque lo primero que hace la función es buscar el caracter '\0' de la cadena final. Al no haberla inicializada a 0 esta contiene datos aleatorios y '\0' puede estar en cualquier sitio. Una vez que strcat encuentra este carácter nulo empezará a copiar t1 ahí.

Para solucionarlo cambia strcat por strcpy que copia desde el principio de la cadena.

Por otra parte: es de mala práctica esconder puntero detrás de un typedef. Mejor si dejas los punteros vistos.