Problemas con array (unidimencional) de caracteres [C++]

Iniciado por .:BlackCoder:., 19 Mayo 2010, 20:58 PM

0 Miembros y 1 Visitante están viendo este tema.

.:BlackCoder:.

Wenas...

Andaba viendo el post "Asignar memoria dinamica..." blablabla... Y pes yo crei ya sabia de memoria dinamica pero pes cuando trate de hacer el problema yo, en C++ no me da los resultados esperados... Lo que quiero hacer, es que el usuario ingresa una palabra y si es diferente de "adios" (tengo problemas con eso, asi que lo puse a que ingrese 4 palabras9 se guarde en un array dinamico, eso es todo... El problema es que nada mas me atrapa la ultima de las palabras las demas no... Y aunque lo hice con la clase string, ya que es mas facil xD lo quiero hacer con char* pes para aprender de los errores  :xD Aca esta el code:
EDITO: el codigo un poco optimizado
Código (cpp) [Seleccionar]
    char aux[20],*cad,*tem;
    for (int a=0;a < 4;a++){
        cin.getline(aux,20);
        tem=new char [strlen(cad)];
        strcpy(tem,cad);
        delete[] cad;
        cad= new char [strlen(tem)+strlen(aux)];
        strcpy(cad,tem);
        strcpy(cad,aux);
        delete[] tem;
    }
    cout<<cad<<endl;
   
    delete[] cad;


Creo que el problema es con strcpy(tem,cad) o cuando asigno memoria con new pes se borra el contenido, pero no estoy seguro de cual es el problema asi que acudo a ustedes...

Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




.:BlackCoder:.

#1
:D Listo resolvi por otro lado... Pongo el code pes por si alguien le sirve...

EDITO: El codigo tienen un problemita, lo estoy resolviendo... No lo uses por ahora  :xD
Código (cpp) [Seleccionar]
char aux[20],*cad,*tem;
   cad=new char [1]();/* No se muy bien que pasa aca, me imagino que se llama un constructor algo asi,
me dijeron que crea una cadena vacia pero si no agrego la linea que sigue no funciona el programa...*/
   strcpy(cad,"");
   for (int a=0;a < 4;a++){
       cin.getline(aux,20);
       tem=new char [strlen(cad)];
       strcpy(tem,cad);
       delete[] cad;
       cad= new char [strlen(tem)+strlen(aux)];
       strcpy(cad,tem);
       strcat(cad,aux);
       delete[] tem;
   }
   cout<<cad<<endl;
   
   delete[] cad;


Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




Littlehorse

Me sorprende que no entiendas porque necesitas reservar memoria primero para cad. En el primer código que pusiste, adonde apunta cad? cual es la longitud que devuelve strlen? cual es el contenido de cad? si te planteas esas preguntas entenderás porque cad necesita ser mas que un puntero que apunta a cualquier parte.

En cualquiera de los casos la mejor opción es usar un contenedor apropiado, podes usar allocators, pero a la larga harías algo similar a un contenedor pero con mas probabilidades de error.

También podes recurrir a las malas practicas y usar realloc y su familia, pero obviamente ese tipo de funciones no son muy amigas de los objetos al desconocer conceptos básicos como los constructores. Pero en fin, como poder, podrías usarlas siempre y cuando no mezcles new/delete con malloc/realloc/free.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

.:BlackCoder:.

El problema no es que no sabia que debia reservar espacio... Si no que los parentesis no los habia visto... nada mas con punteros a funciones, pero obviamente no de esa forma...

Y a la final que me estas diciendo? xD que utilize las funciones de C en vez de los operadores de C++?...

Cita de: Littlehorse en 20 Mayo 2010, 07:40 AMEn cualquiera de los casos la mejor opción es usar un contenedor apropiado, podes usar allocators, pero a la larga harías algo similar a un contenedor pero con mas probabilidades de error.

allocators? Eso no es de C? 0o?? dejame estudiar sobre eso... pero en la noche porque voy saliendo  :-\

PD: Las preguntas si me las pueden aclarar horita  :xD

Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




Littlehorse

No, si te fijas en el post queda demasiado claro que una cosa no tiene nada que ver con la otra.

realloc y toda su familia puede utilizarse, pero como te dije antes, no seria lo ideal y mucho menos cuando tratamos con objetos. Lo ideal seria usar un contenedor apropiado.

Ahora bien, respecto de los contenedores (vector por ejemplo) supongo que alguna vez te habrás preguntado como implementan el manejo de memoria dinámica, y es ahí donde entran los allocators. A grandes rasgos es una interfaz común para que los distintos tipos de contenedores no tengan que preocuparse específicamente sobre el manejo de memoria dentro de su implementación.
Para mas información sobre eso busca sobre allocators -STL-.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

.:BlackCoder:.

Okas, voy a leer sobre eso. Ya termine el code (ayudado)... El problema era que no le di espacio al puntero para los caracteres nulos ('\0')...Aca ta el code:

Código (cpp) [Seleccionar]
    char aux[20],*cad,*tem;
    cad=new char [1]();
    strcpy(cad,"");
    for (int i=0;i<4;i++){
        cin.getline(aux,20);
        tem=new char [strlen(cad)+1];
        strcpy(tem,cad);
        delete[] cad;
        cad= new char [strlen(tem)+strlen(aux)+1];
        strcpy(cad,tem);
        strcat(cad,aux);
        delete[] tem;
    }
    cout<<cad<<endl;
   
    delete[] cad;


Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja