eliminar componente array

Iniciado por mariano96, 13 Febrero 2015, 19:32 PM

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

mariano96

Hola de nuevo xD,

tengo un problema con este programa:

int eliminaTodasApariciones(char orig[], char c, char dest[]){
   int i,j,numElim;

   numElim = 0;
   
   for (i = 0; i < strlen(orig); i++){
      for (j = i; j < strlen(orig); j++){
         
         if (orig != c){
            dest[j] = orig;
            dest[j + 1] = '\0';
         }
         
      }
      if(orig == c){

         numElim++;

      }
   }

   return numElim;
}

Se supone que tiene que eliminar el caracter que indique en la cadena pero al ejecutarlo pongo "hola" y el caracter a eliminar ('o') y en lugar de devolverme "hla" me devuelve hhla.
AYUDA please

fary

#1
Te complicas mucho, fíjate en este ejemplo que te he preparado.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * EliminaCaracter(char * cadena, char caracter);

int main()
{
    char * cadena = "hola";
    char c = 'o';

    char * resul = EliminaCaracter(cadena,c);
   
    printf("%s\n",resul);
   
    free(resul);
    return 0;
}


char * EliminaCaracter(char * cadena, char caracter)
{
    char * buffer = malloc(strlen(cadena));

    int i,a=0;
   
    for (i=0;*(cadena+i)!= '\0';i++)
    {
        if (*(cadena+i) != caracter)
        {
            buffer[a] = *(cadena+i);
            a++;
        }
    } 
    return buffer;     
}


Simplemente copias en un nuevo buffer todos los caracteres que no coincidan con el que quieres eliminar.

saludos.
Un byte a la izquierda.

mariano96

Gracias por el aporte y tu tiempo pero tengo que hacerlo usando otra cadena (cadena de destino) y, además, hay conceptos en tu código que todavía no he dado.

crack81

El ejemplo que te dio es una buena solucion lo que dices de cadena destino seria muy similar porque tambien tendra que un llenar puntero de char, asi que para hacer eso hay que reservar memoria

lo otro seria como tu ejemplo usando arreglo de caracteres pero no es lo mas correcto ni en c ni en c++ porque estarias creando posicion en tiempo de ejecucion de una manera no optima ya que de esa forma la estarias guardando en la pila

hacer esto char datos[strlen(tamano)];//no es correcto pero puede ser que corra ya que se guardara en la pila

lo mas correcto es reservar memoria como es el caso de malloc
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

rir3760

Cita de: fary en 13 Febrero 2015, 20:27 PMSimplemente copias en un nuevo buffer todos los caracteres que no coincidan con el que quieres eliminar.
Dos comentarios sobre tu programa: 1) En la llamada a malloc hay que reservar un carácter adicional para prevenir el caso donde el carácter a buscar no se encuentre en la cadena y 2) Falta agregar el '\0' a la nueva cadena.

----

Cita de: mariano96 en 13 Febrero 2015, 20:57 PMGracias por el aporte y tu tiempo pero tengo que hacerlo usando otra cadena (cadena de destino)
El ejemplo de fary muestra la forma mas simple de realizar la operación, no encontraras una mas fácil y por ello no debes tener problemas al aplicarla a tu programa, si los tienes publica el código fuente actualizado.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language