Foros del Web » Programación para mayores de 30 ;) » Programación General »

Problema con strcat y memoria dinámica

Estas en el tema de Problema con strcat y memoria dinámica en el foro de Programación General en Foros del Web. Hola, Estoy haciendo una función en C++ para concatenar una cadena con otra con memoria dinámica, el problema es que me da error Código: char* ...
  #1 (permalink)  
Antiguo 04/01/2006, 09:14
Avatar de txetxol  
Fecha de Ingreso: febrero-2002
Ubicación: Pamplona
Mensajes: 73
Antigüedad: 22 años, 2 meses
Puntos: 1
Problema con strcat y memoria dinámica

Hola,

Estoy haciendo una función en C++ para concatenar una cadena con otra con memoria dinámica, el problema es que me da error

Código:
char* strcatnredim(char *a, char *b, int n)
{
	char *paux=NULL, *ptmp=NULL;

	paux=new char[!n?strlen(b):n+1]; *paux='\x0'; // Reserva memoria la cadena a sustituir
	if(n) strncat(paux,b,n); else strcpy(paux,b); // Copia la cadena

	ptmp=new char[a?strlen(a):0+strlen(paux)+1]; *ptmp='\x0'; // Reserva memoria para la nueva cadena
	if(a) strcpy(ptmp,a); strcat(ptmp,paux);                  // Copia la cadena resultante

	if(a) delete [] a; 
	delete [] paux;
	return ptmp;
}
Según he leido strcat hace una copia de la segunda cadena y la une a la primera. ¿o no es así? sino no daría error al liverra memoria.
¿Como puedo solucionarlo?
¿Como podría guardar el resultado directamente en a? si hago a=ptmp no se guarda al salir de la función.


Muchas gracias
  #2 (permalink)  
Antiguo 06/01/2006, 12:09
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
strcat solo copia una cadena de una direccion de memoria a otra, no hace ninguna copia.

Lo podes solucionar calculando bien el tamaño de ptmp, no es suficiente para lo que tratas de escribirle. Siempre acordate de que strlen() no devuelve el \0 terminador de cadena que es necesario reservar.

Podes guardar el resultado en a usando una referencia (*&) o un doble puntero (**).

En cuanto al codigo, es ilegible, los nombres de las variables no dicen absolutamente nada, varias sentencias de codigo en una sola linea, ningun espacio.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 06/01/2006, 18:24
Usuario baneado!
 
Fecha de Ingreso: febrero-2005
Mensajes: 116
Antigüedad: 19 años, 2 meses
Puntos: 0
Por otro lado, cosas como:

Código:
paux=new char[!n?strlen(b):n+1];
que pueden parecer muy "guays" no se llevan en C++.

Por otra parte, si usas C++, ¿no deberías de usar la STL, clase String, o implementar otra?

Otra cosa,

Código:
if(a) delete [] a;
No hace falta el if(a), delete no elimina punteros nulos (cierto?).
  #4 (permalink)  
Antiguo 10/01/2006, 02:52
Avatar de txetxol  
Fecha de Ingreso: febrero-2002
Ubicación: Pamplona
Mensajes: 73
Antigüedad: 22 años, 2 meses
Puntos: 1
Pues gracias por contestar, por motivos de trabajo no pude entrar antes, pero al final me implemente una clase cadena y la he usado para hacerlo.

Muchas gracias de todas formas.

PD: Estoy empezando con c++
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:38.