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..
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.
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.
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.
No he revisado el código completo, pero me pregunto cómo salir de este bucle while si la condición siempre se cumple:
while(index < omitido) {
ret[index] = temporal[index];
}
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';
}
}