Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: bash en 20 Abril 2016, 23:17 pm



Título: [AYUDA] retornar un char * valido
Publicado por: bash en 20 Abril 2016, 23:17 pm
Un saludo a todos!!


necesito su consejo por favor , les cuento tengo una funcion que quita  algunos caracterers y luego retornar un puntero a char * que deberia ser valido pero siempre me da null o la aplicacion se cae. es mejor que les muestre... la hize de varias manera..

Código
  1.  
  2.  
  3. char *purge_char(char *buff, char ch)
  4. {
  5.    char *ret = NULL; //OJo
  6.    char *temporal = NULL;
  7.    int len = strlen(buff);
  8.    int index= 0;
  9.    int omitidos = 0;
  10.  
  11.     temporal = new char[len + 1];
  12.     while(index < len)
  13.    {
  14.         if(buff[index] != ch)
  15.           {
  16.                temporal[omitido] = buff[index];
  17.                omitido++;
  18.           }
  19.          index++;
  20.    }
  21.  
  22.   ret = new char[omitido + 1];
  23.   index = 0;
  24.   while(index < omitido)
  25.    {
  26.         ret[index] = temporal[index];
  27.    }
  28.    delete temporal;  
  29.    return ret;
  30. }
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42. char *purge_char(char *ret, char *buff, char ch)
  43. {
  44.    if(ret != NULL)
  45.     {
  46.        delete ret;
  47.        ret = NULL;
  48.      }  
  49.     char *temporal = NULL;
  50.    int len = strlen(buff);
  51.    int index= 0;
  52.    int omitidos = 0;
  53.  
  54.     temporal = new char[len + 1];
  55.     while(index < len)
  56.    {
  57.         if(buff[index] != ch)
  58.           {
  59.                temporal[omitido] = buff[index];
  60.                omitido++;
  61.           }
  62.          index++;
  63.    }
  64.  
  65.   ret = new char[omitido + 1];
  66.   index = 0;
  67.   while(index < omitido)
  68.    {
  69.         ret[index] = temporal[index];
  70.    }
  71.    delete temporal;  
  72.    return ret;
  73. }
  74.  
  75.  
  76.  

esas dos formas son las que yo uso y me dan error ambas , me gustaria que alguien me aconsejara please.


Título: Re: [AYUDA] retornar un char * valido
Publicado por: MAFUS en 20 Abril 2016, 23:24 pm
A ver si alguien con compilador C++ puede probar. Pero por lo que he visto así a simple vista:
Declaras la variable 'omitidos', nótese que es plural, y cuándo la usas escribes 'omitido', en singular. El compilador debe haberte avisado en los mensajes de error.



Más, por lo poco que se de C++, si declaras un array con new TIPO[], debes usar delete [] variable para borrarla.



Te falta incluir los caracteres de final de cadena '\0' al final de las cadenas que creas.


Título: Re: [AYUDA] retornar un char * valido
Publicado por: bash en 21 Abril 2016, 15:29 pm
gracias por responder.

la s de omitidos es por la cantidad de caracteres el indentificador no importa en este caso y el programa compila y cierto debo usar [] para evitar memory leaks pero eso el compilador lo ha pasado por alto  y  en primera instancia no debe dar error.


Título: Re: [AYUDA] retornar un char * valido
Publicado por: class_OpenGL en 21 Abril 2016, 16:03 pm
No he revisado el código completo, pero me pregunto cómo salir de este bucle while si la condición siempre se cumple:

Código
  1. while(index < omitido) {
  2.    ret[index] = temporal[index];
  3. }


Título: Re: [AYUDA] retornar un char * valido
Publicado por: MAFUS en 22 Abril 2016, 14:45 pm
Observa las siguientes funciones, puede que te ayude con lo que buscas.
Código
  1. char* purge_char(const char *buff, char c) {
  2.    /* Genera un nuevo dato en el montón que debe ser liberado
  3.      * con la función free.
  4.      */
  5.    char *retval = NULL;
  6.    int buff_len;
  7.    int i;
  8.    int pos = 0;
  9.  
  10.    if(buff) {
  11.        buff_len = strlen(buff);
  12.        retval = malloc(buff_len + 1);
  13.        if(retval) {
  14.            for(i = 0; i < buff_len; ++i) {
  15.                if(buff[i] != c) {
  16.                    retval[pos] = buff[i];
  17.                    pos++;
  18.                }
  19.            }
  20.        }
  21.        retval[i] = '\0';
  22.    }
  23.    /* La línea de código que viene a continuación es por si
  24.      * prima el espacio a la velocidad. En caso contrario coméntala
  25.      * o bórrala.
  26.      */
  27.    retval = realloc(retval, strlen(retval) + 1);
  28.  
  29.    return retval;
  30. }

Código
  1. void purge_char2(char *buff, char c) {
  2.    /* Modifica el argumento buff para no gastar memoria. Por
  3.      * contrapartida el contenido anterior de buff queda destruido.
  4.      * El tamaño asignado a buff sigue teniendo el tamaño origina.
  5.      * La función no puede ser llamada usando una constante de cadena
  6.      * o va a fallar.
  7.      */
  8.    int i, j;
  9.  
  10.    if(buff) {
  11.        for(i = 0, j = 0; i < strlen(buff); ++i) {
  12.            if(buff[i] != c) {
  13.                buff[j] = buff[i];
  14.                j++;
  15.            }
  16.        }
  17.        buff[j] = '\0';
  18.    }
  19. }