Crear funciones análogas a srtlen(), strcpy(), strcat() y strcmp()

De Ejercicios

Contenido

Enunciado

CREAR FUNCIONES ANÁLOGAS A STRLEN(), STRCPY(), STRCAT() Y STRCMP(). Realiza un programa principal que utilice varias cadenas de caracteres y llame a unas funciones programadas por ti que realicen las mismas tareas que strlen( ), strcpy( ), strcat( ) strcmp( ). Deberás llamar a tus funciones con un nombre distinto a las que existen en la librería de C. Te sugerimos los siguientes nombres:

  • strlen( ) ⇒ cuentaCaracteres( )
  • strcpy( ) ⇒ copiaCadenas( )
  • strcat( ) ⇒ concatenaCadenas( )
  • strcmp( ) ⇒ comparaCadenas( )

Guarda estas funciones en un fichero análogo a string.h y al que llamarás misfunc.h e incluye en el encabezamiento del programa principal la instrucción:

  1. include "misfunc.h"

El programa principal se llamará cadenas.c.

Soluciones

Programa en C por Angel

Solución comentada del Ejercicio:

/* fichero cadenas.c */
#include <stdio.h>
#include "misfunc.h"
unsigned cuentaCaracteres(const char*);
char* copiaCadenas(char*, const char*);
char* concatenaCadenas(char*, const char*);
int comparaCadenas(const char*, const char*);
void main(void) {
  char car1[100] = "Esto es una cadena";
  char car3[100] = "Esto es otra cadena";
  char car2[100] = "";
  printf("car1 es: \"%s\"\n", car1);
  printf("car2 es: \"%s\"\n", car2);
  printf("car3 es: \"%s\"\n", car3);
  printf("No de caracteres de car1: %d\n", cuentaCaracteres(car1));
  copiaCadenas(car2, car1); /* se copia car1 en car2 */
  printf("car2 ahora es: \"%s\"\n", car2);
  printf("car3+car1 es: \"%s\"\n", concatenaCadenas(car3,car1));
  printf("car1-car2 es %d\n", comparaCadenas(car1,car2));
  printf("car2-car3 es %d\n", comparaCadenas(car2,car3));
}

Comentario

El programa principal crea tres cadenas de caracteres y luego opera con ellas de forma análoga a como lo hacen las funciones strlen(), strcpy(), strcat() y strcmp(). Previamente al comienzo de la función main() se ha incluido la declaración de las funciones que luego van a ser utilizadas. Esta declaración no es necesaria porque se ha incluido el fichero misfunc.h, en el que están definidas las funciones posteriormente declaradas. La definición puede sustituir en este caso a la declaración. Observa que los argumentos de las funciones que no van a ser modificados se declaran como const.

/* fichero misfunc.h */
unsigned cuentaCaracteres(const char* carac) {
unsigned i=0;
while (carac[i]!='\0')
   i++;
   return i;
}


La función cuentaCaracteres() cuenta los caracteres de la cadena detectando el carácter o marca de final de cadena. Por lo demás, esta función es muy sencilla.

char* copiaCadenas(char* carac1, const char* carac2) {
  int i=0;
  while ((carac1[i]=carac2[i])!='\0')
     i++;
  return carac1;
}


La función copiaCadenas() anterior tiene como punto interesante el copiar el carácter antes de compararlo con la marca de fin de cadena. Para ello la asignación debe ir entre paréntesis, de modo que se realice antes de comparar con el carácter de fin de cadena. De este modo se asugura que dicho carácter es también copiado por la función. Se supone que carac1 tiene espacio suficiente.

char* concatenaCadenas(char* carac1, const char* carac2) {
   int i=-1, j=0;
   while (carac1[++i]!='\0')
   ;
   while (carac2[j]!='\0')
   carac1[i++]=carac2[j++];
   carac1[i]='\0';
   return carac1 ;
}


Se detecta primero el final de la cadana carac1[ ]. Después se van copiando a continuación todos los caracteres de carac2[ ] y finalmente se añade el carácter fin de cadena.

int comparaCadenas(const char* carac1, const char* carac2) {
  int i=0, dif;
  while (carac1[i]!='\0') {
    dif=carac1[i]-carac2[i];
    if (dif==0)
       i++;
      else
         return (dif);
  }
  if (carac2[i]=='\0')
      return(0);
    else
      return(-carac2[i]);
}


Para comparar las dos cadenas, lo que hacemos es recorrer la primera de ellas (carac1), hasta que encontramos el caracter \0. Dentro de este bucle se restan los caracteres en posiciones equivalentes de las dos cadenas. Recuérdese que un carácter se puede manejar como carácter o se puede considerar su equivalencia ASCII. Así, si restamos los dos caracteres, lo que en realidad estamos haciendo es restar su número ASCII. Por tanto, si la diferencia entre los dos caracteres es cero, significa que son iguales. El bucle continúa hasta que encuentra dos caracteres distintos, con lo cual no se cumple la sentencia if (dif==0) y se ejecuta return(dif); con lo que se devuelve un valor distinto de cero y, por tanto, las cadenas son distintas. Si se llega al final de la primera cadena y en esa posición se tiene que la segunda cadena acaba también (carac2[i]='\0') es que las cadenas son iguales y se devuelve un cero. Si se llega al final de la primera cadena antes de llegar al final de la segunda se devuelve el primer carácter diferente de ésta cambiado de signo.

Tipos de soluciones