[AYUDA] retornar un char * valido

Iniciado por bash, 20 Abril 2016, 23:17 PM

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

bash

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 (cpp) [Seleccionar]



char *purge_char(char *buff, char ch)
{
    char *ret = NULL; //OJo
    char *temporal = NULL;
    int len = strlen(buff);
    int index= 0;
    int omitidos = 0;
   
     temporal = new char[len + 1];
     while(index < len)
    {
         if(buff[index] != ch)
           {
                temporal[omitido] = buff[index];
                omitido++;
           }
          index++;
    }
   
   ret = new char[omitido + 1];
   index = 0;
   while(index < omitido)
    {
         ret[index] = temporal[index];
    }
    delete temporal; 
    return ret;
}











char *purge_char(char *ret, char *buff, char ch)
{
    if(ret != NULL)
     {
        delete ret;
        ret = NULL;
      }   
     char *temporal = NULL;
    int len = strlen(buff);
    int index= 0;
    int omitidos = 0;
   
     temporal = new char[len + 1];
     while(index < len)
    {
         if(buff[index] != ch)
           {
                temporal[omitido] = buff[index];
                omitido++;
           }
          index++;
    }
   
   ret = new char[omitido + 1];
   index = 0;
   while(index < omitido)
    {
         ret[index] = temporal[index];
    }
    delete temporal; 
    return ret;
}




esas dos formas son las que yo uso y me dan error ambas , me gustaria que alguien me aconsejara please.
gracias por responder mis dudas

MAFUS

#1
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.

bash

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.
gracias por responder mis dudas

class_OpenGL

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 (cpp) [Seleccionar]
while(index < omitido) {
    ret[index] = temporal[index];
}

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

MAFUS

Observa las siguientes funciones, puede que te ayude con lo que buscas.

char* purge_char(const char *buff, char c) {
    /* Genera un nuevo dato en el montón que debe ser liberado
     * con la función free.
     */
    char *retval = NULL;
    int buff_len;
    int i;
    int pos = 0;
   
    if(buff) {
        buff_len = strlen(buff);
        retval = malloc(buff_len + 1);
        if(retval) {
            for(i = 0; i < buff_len; ++i) {
                if(buff[i] != c) {
                    retval[pos] = buff[i];
                    pos++;
                }
            }
        }
        retval[i] = '\0';
    }
    /* La línea de código que viene a continuación es por si
     * prima el espacio a la velocidad. En caso contrario coméntala
     * o bórrala.
     */
    retval = realloc(retval, strlen(retval) + 1);
   
    return retval;
}



void purge_char2(char *buff, char c) {
    /* Modifica el argumento buff para no gastar memoria. Por
     * contrapartida el contenido anterior de buff queda destruido.
     * El tamaño asignado a buff sigue teniendo el tamaño origina.
     * La función no puede ser llamada usando una constante de cadena
     * o va a fallar.
     */
    int i, j;
   
    if(buff) {
        for(i = 0, j = 0; i < strlen(buff); ++i) {
            if(buff[i] != c) {
                buff[j] = buff[i];
                j++;
            }
        }
        buff[j] = '\0';
    }
}