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;