Foros del Web » Programación para mayores de 30 ;) » C/C++ »

concatenar char* y string en c++

Estas en el tema de concatenar char* y string en c++ en el foro de C/C++ en Foros del Web. Hola gente. Tengo un lio con el uso de String y char* que nose como resolver. Os comento. Tengo un programa en c++ que lo ...
  #1 (permalink)  
Antiguo 22/10/2007, 06:38
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 9 meses
Puntos: 7
Sonrisa concatenar char* y string en c++

Hola gente. Tengo un lio con el uso de String y char* que nose como resolver. Os comento.

Tengo un programa en c++ que lo que hace inicialmente es obtener el valor de la variable de entorno $HOME(contiene la ruta del directorio home de un usuario en linux).

Esto lo hago con:

char * ruta;
ruta=getEnv("HOME");

Este programa se ejecuta con dos argumentos asi que yo lo quier obtener es para que os hagais una idea la cadena:

$HOME/$1/$2

Es decir, concatenar el directorio HOME del usuario cuyo valor obtengo en la variable "ruta" con los dos parametros que me pasa el usuario al ejecutar el programa.

Entonces yo estaba haciendo:

strcat(ruta, argv[1]);
strcat(ruta,"/");
strcat(ruta,argv[2]).

El problema es que cuando imprimo el valor final de la variable "ruta" me salta una ventana de windows diciendome que no se puede escribir en memoria. Supongo que es que al inicializar la variable ruta con el valor de la variable de entorno HOME ya no hay mas espacio libre en esa variable y todo lo que estoy concatenando se está saliendo de su rango de memoria..........

Entonces probé a reservar mas memoria haciendo:

char * ruta;
ruta=getEnv("HOME");
int n=strlen(argv[1])+strlen(argv[2])+strlen(ruta);
char * final[n];
strcat(final,ruta);
strcat(final,"/");
strcat(final,argv[1]);
strcat(final,"/");
strcat(final,argv[2]);

Pero el compilador se queja en la linea de :

strcat(final,ruta);


Alguna idea de concatenar estas cadenas???

Saludos.
  #2 (permalink)  
Antiguo 22/10/2007, 08:17
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 7 meses
Puntos: 28
Re: concatenar char* y string en c++

El problema no está en la concatenación de las cadenas, está en el tamaño de final. En primer lugar no puedes usar una variable en la declaración de final:
Código:
...
char * final[n];
...
Tienes dos opciones, le colocas un tamaño fijo:
Código:
...
char final [1024];
...
o usas memoria dinámica
Código:
...
char *final = NULL;
final = malloc(n);
// tu codigo

free(final);
...
Y por último recuerda calcular bien el tamaño de la cadena...revisa eso y acuerdate del '\0' que va al final de todas las cadenas.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #3 (permalink)  
Antiguo 22/10/2007, 08:20
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 7 meses
Puntos: 74
Re: concatenar char* y string en c++

No se muy bien como encaja el String en realidad en toda esta historia pero mejor usa memoria dinamica de verdad con malloc (C) o new (C++).

Ej. super simple:
Código:
char *final = (char*)malloc(n);
//usar
free(final); //liberar
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #4 (permalink)  
Antiguo 22/10/2007, 10:51
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Re: concatenar char* y string en c++

También podrías usar:

Código:
if (argc < 3)
     return ...;
char * tmp = getEnv("HOME");
if (!tmp)
     return ...;
std::string final(std::string(tmp) + '/' + std::string(argv[1]) + '/' + std::string(argv[2]));
  #5 (permalink)  
Antiguo 22/10/2007, 12:03
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: concatenar char* y string en c++

Muchas gracias a todos por responder.

Probé con lo que puso MaxExtreme y me funcionó a la primera.

Con la otra opción de reservar memoria me pasa una cosa muy curiosa:

Si utilizo la funcion malloc de esta manera:

char * ruta = getEnv("HOME");
int n=strlen(argv[1])+strlen(argv[2])+strlen(ruta);
char *final;
final=(char*)malloc(n);
memset(final,0, n);

strcat(final,ruta);

strcat(final,"/");

strcat(final,argv[1]);

strcat(final,"/");
strcat(final,argv[2]);

Esto también me funciona perfectamente. Pero si sustituyo la linea de la instrucción malloc por:

final=new char(n);

Me salta una ventana de windows diciendo que no se puede escribir en memoria. Nose si es que no estoy reservando suficiente memoria.....aunque con malloc tambien reservo 'n' posiciones.....


Muchas gracias de nuevo por responder.
  #6 (permalink)  
Antiguo 22/10/2007, 12:40
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 7 meses
Puntos: 74
Re: concatenar char* y string en c++

final = new char[n];
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 22/10/2007, 14:03
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 7 meses
Puntos: 28
Re: concatenar char* y string en c++

Creo que no tomaste en cuenta lo que te mencione de la cantidad de caracteres...¿estás contando los dos '/' y el '\0'?
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #8 (permalink)  
Antiguo 22/10/2007, 15:05
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: concatenar char* y string en c++

_Lucifer_, si tomé en cuenta esos caracteres.

Al final el problema estaba en lo que decia "Eternal Idol". Yo habia puesto:

final=new char(n);

Y era:

final = new char[n];


Por poner paréntesis en vez de corchetes me fallaba jeje.


Muchas gracias a todos por vuestras respuestas. Me habeis ayudado mucho.

Saludos.
  #9 (permalink)  
Antiguo 22/10/2007, 15:24
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 7 meses
Puntos: 74
Re: concatenar char* y string en c++

Cita:
Iniciado por aeb_asturias Ver Mensaje
_Lucifer_, si tomé en cuenta esos caracteres.
Viendo el codigo que mostraste hasta ahora para calcular n _Lucifer_ tiene razon.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 17:54.