/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda! Función que elimina símbolos de un string.

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
danfg



Registrado: 30 Ene 2014
Mensajes: 2

MensajePublicado: 30/01/2014 7:34 am
Título: Ayuda! Función que elimina símbolos de un string.

Hola, necesito hacer una función en la que se pasa como argumento un string (como const chat *) y necesito comprobar que ese string no sea NULL, que ese string se copie en otro string de tupo chat* para que se pueda modificar, y que por ultimo sustituya los símbolos de la cadena por espacios. Tengo el código pero necesito saber si esta bien. ¿Alguien que me pueda ayudar? Estoy desesperado.


extern char * eliminate_chars(char * dst, const char * src, const char * seps, size_t max)
{
int i;

//Comprobamos que los datos que no pasan como argumentos de la funcion son correctos
if (src == NULL){
printf ("Error\n");
return 0;
}
if (dst == NULL){
printf ("Error\n");
return 0;
}

//Ahora copiamos src (que es un const char que no se puede modificar) a dst
if (src && dst){
while (*src){
*dst++=*src++;
}
}

//Por ultimo, recorremos el string dst y sustituimos los simbolos por espacios
for (i=0; i<DIM; i++){
if ((dst[i] < 65 || dst[i] > 90) && (dst[i] < 97 || dst[i] > 122)){
dst[i]= 32;
}
}

}
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7517
Ubicación: Mexico

MensajePublicado: 30/01/2014 8:36 am
Título:

Hay algunos errores y deficiencias.

Lo primero a eliminar es el uso de "extern" en la definición de la función, ello porque su uso no es necesario (tendrá el mismo efecto con o sin ella). También hay que eliminar esta sentencia de comprobación:
Código:
if (src && dst){

Porque si se llego a ese punto en la función ambos valores no pueden ser igual a NULL (si lo fueran la función habría terminado con alguna de las comprobaciones anteriores).

El primer error importante es utilizar el parámetro "dst" sin resguardarlo (por ello ya no puedes acceder al bloque original), lo mas sencillo aquí es el uso de una variable como indice. El segundo es no agregar el terminador '\0' al final de la cadena y el tercero es procesar en el ultimo bucle "DIM" caracteres cuando solo debes procesar los caracteres hasta llegar al '\0'.

La función con los cambios:
Código:
char *eliminate_chars(char *dst, const char *src, const char *seps, size_t max)
{
   int i;
   
   if (src == NULL || dst == NULL)
      puts("Error");
   else {
      for (i = 0; (dst[i] = src[i]) != '\0'; i++)
         ;
     
      for (i = 0; dst[i] != '\0'; i++)
         if ((dst[i] < 'A' || dst[i] > 'Z') && (dst[i] < 'a' || dst[i] > 'z'))
            dst[i] = ' ';
   }

   return dst;
}


Por ultimo bien tu descripción del enunciado esta incompleta o la plantilla que te dieron tiene un error ya que los parámetros "seps" y "max" no los describes como tampoco los utilizas en el programa.

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
Volver arriba
danfg



Registrado: 30 Ene 2014
Mensajes: 2

MensajePublicado: 30/01/2014 9:05 am
Título: Gracias

Perfecto por la ayuda. Muchisimas gracias
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com