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;