Ejercicios Con Cadenas

Se muestran a continuación la simulación de algunas funciones como strstr, strcmp y strlen

main.c

#include <stdio.h>
#include <stdlib.h>
#include "cadenas.h"

int main()
{
    char s1[20] = "Hola a todos\0";
    char s2[5] = "la\0";

    char s3[10] = "cadena1";
    char s4[10] = "claro\0";

    ///printf( "s1=%s\n", s1 );
    ///printf( "s2=%s\n", s2 );
    ///printf( "strstr(s1,s2) = %s\n", strstr( s1, s2 ) );

    //printf( "%s\n", strcpy( s3, s4 ) );
    printf( "%zu\n", strlen( s3 ) );

    return 0;
}

cadenas.h

#include <stdio.h>

#ifndef CADENAS_H_INCLUDED
#define CADENAS_H_INCLUDED

char *strstr(const char *s1, const char *s2);
int strcmp(const char *s1, const char *s2);
char *strcpy(char *s1, const char *s2);
size_t strlen(const char *s);

#endif // CADENAS_H_INCLUDED

cadenas.c

///******************************************************************************
///  Nombre:	    strstr.
///  Descripción:	Localiza la primera aparición en la cadena apuntada por s1
///                 de la secuencia de caracteres en la cadena apuntada por s2.
///  Parametros: 	.
///  Retorno:       La función retorna un puntero a la cadena encontrada, o un
///                 puntero nulo si no se encontró la cadena.
///                 Si s2 apunta a una cadena de longitud cero, la función
///                 retorna s1.
///******************************************************************************
char *strstr(const char *s1, const char *s2)
{
	while(*s1)
	{
		if( strcmp(s1,s2) )
			return (char *)s1;
		s1++;
	}

	return (char *)s1;
}

///******************************************************************************
///  Nombre:		strcmp.
///  Descripción:	compara la igualdad de dos cadenas.
///  Parametros: 	dos punteros a cadenas constantes.
///  Retorno:       devuelve la diferencia entre ambas. Si son iguales devuelve 0 sino mayor que cero si s1 es mayor que s2 y sino si s1 es menor que s2.
///******************************************************************************
int strcmp(const char *s1, const char *s2)
{
	while(*s1 && *s2)
	{
		if(*s1 == *s2)
			s1++ , s2++;
		else
			return *s1- *s2;
	}

	return *s1-*s2;
}

///******************************************************************************
///  Nombre:		strcpy.
///  Descripción:	Copia la cadena apuntada por s2 (incluyendo el carácter nulo)
///                 a la cadena apuntada por s1.
///  Parametros: 	un punteros a la cadena s1 y un puntero constante a la
///                 cadena s2.
///  Retorno:       la cadena s1 modificada.
///******************************************************************************
char *strcpy(char *s1, const char *s2)
{
    char *aux = s1;

	while(*s2)
        *s1++ = *s2++;

	*s1='\0';

	return aux;
}

///******************************************************************************
///  Nombre:		strlen.
///  Descripción:	Calcula el número de caracteres de la cadena apuntada por s.
///  Parametros: 	un punteros a la cadena s.
///  Retorno:       numero de caracteres de la cadena s.
///******************************************************************************
size_t strlen(const char *s)
{
    size_t cant = 0;

	while(*s++)
            cant++;

	return cant;
}

  • Probar que pasa si al strcpy la primer cadena que es donde voy a copiar es mas chica que la segunda.
  • Ver como devolver el tipo de dato size_t ( deberá castearlo a int ).
  • Que pasa si yo modifico la cadena y no tengo el puntero apuntando al principio.
  • Que pasa si recibo (const char*s) -> Debo castearlo : char * ini = ( char*) s.

Determinar si una cadena es Palindromo

main.c

#include <stdio.h>
#include <stdlib.h>
#include "funciones.h"

int main()
{
    char cadena[100] = "   a  ";

    if (es_palindromo(cadena)){
            printf("%s ES PALINDROMO", cadena);
    } else {
            printf("%s NO ES PALINDROMO", cadena);
    }

    return 0;
}

funciones.h

#ifndef FUNCIONES_H_INCLUDED
#define FUNCIONES_H_INCLUDED

int es_palindromo(const char *cad);

#define ES_LETRA(x) ( ((x) >= 'a' &&  (x) <= 'z') || ((x) >= 'A' &&  (x) <= 'Z') )

#define A_MINUSCULA(x) ( ((x) >= 'A' &&  (x) <= 'Z') ? ( (x) - 32 ) : (x))

#define A_MAYUSCULA(x) ( ((x) >= 'a' &&  (x) <= 'z') ? ( (x) + 32 ) : (x))

#define ES_PALINDROMO 1
#define NO_PALINDROMO 0

#endif // FUNCIONES_H_INCLUDED

funciones.c

#include "funciones.h"

int es_palindromo(const char *cad)
{
    const char *fin = cad;

    while(*fin) fin++;

    fin--;

    while(cad < fin){
        while(!ES_LETRA(*cad))
            cad++;
        while(!ES_LETRA(*fin))
            fin --;

        if(!ES_LETRA(*cad) || !ES_LETRA(*fin) || A_MINUSCULA(*cad) != A_MINUSCULA(*fin))
            return NO_PALINDROMO;

        cad++, fin--;
    }

    return ES_PALINDROMO;
}

Ejercicios para hacer en clase:

  • Eliminar blancos iniciales de una cadena.
  • Eliminar blancos intermedios en una cadena.
  • Eliminar blancos finales.
  • 1 letra de cada palabra en mayúscula y el resto en minúscula.
  • Reemplazar una cadena por otra.
  • Corrimiento de texto : abcd -> cdab. Ejemplo corro 2 caracteres para la derecha y como se cae del vector vuelve a empezar.
  • Conta la cantidad de vocales.
  • Generar una nueva cadena que será la primera cadena leída, con las vocales convertidas a MAYÚSCULAS
  • Invertir una cadena in situ.
  • Modelo de parcial: aaaaaddffffeggg-> 5a2d4fe3g // a(5)d(2)f(4)eg(3) 

Recordar que si tengo una funciona que recibo un parámetro con ( const char * s) y quiero asignarlo a un puntero debo castearlo:

char*ini = (char*)s;