CADENAS DE CARACTERES Lenguajes de programación LPSI EUI UPM • • • • Arrays unidimensionales de caracteres ‘\0’ es el carácter nulo Toda cadena debe acabar en ‘\0’ Lo que hay después de ‘\0’ en el array no se considera parte de la cadena • Las cadenas constantes van entre “ ” “¡Venga ya!” ’¡’ ‘V’ ‘e‘ ‘n’ ‘g’ ’a’ ‘‘ ‘y’ ‘a’ ‘!’ ‘\0’ Lenguajes de programación LPSI EUI UPM char nombre [25] = {‘B’,’u’,’z’,’z’,’ ‘,’L’,’i’,’g’,’h’,’t’,’y’,’e’,’a’,’r’,’\0’}; char edif [ ] = “casamata”; char no_se [15] = “”, desc[20] = “subproducto”; char trampa [12] = “vacío”; char *color = “amarillo”; Lenguajes de programación LPSI EUI UPM char titulo [40] = “Una notte a Napoli”; char c = ‘Ñ’, *p = titulo; char *grupo = “Pink Martini” titulo[1] = c; *(p+1) = ‘n’; grupo [6] = ‘T’; grupo = &c; *grupo = ‘x’; ¡ERROR! Lenguajes de programación LPSI EUI UPM main () { char cadena [15] = “Trabuco”, *p = cadena; for (; *p; p++) printf (“%s”, p); } Lenguajes de programación LPSI EUI UPM main () { char semana [7][[10] = {“lunes”, “martes”, “miércoles”, “jueves”, “viernes”, “sábado”, “domingo”}, dia, *p; for (dia = 0; dia < 7; dia++) { printf (“%s\n”, semana[dia]); p = semana + dia; printf (“%s\n”, p); } Lenguajes de programación LPSI EUI UPM MANEJO DE MEMORIA – string.h void * memcpy (void *s1, const void *s2, unsigned n) • Copia n bytes de s2 en s1 • Devuelve s1 void * memmove (void *s1, const void *s2, unsigned n) • Copia n bytes desde s2 a s1 • Devuelve s1 • Usa una zona auxiliar para la copia Lenguajes de programación LPSI EUI UPM MANEJO DE MEMORIA – string.h int memcmp (const void *s1, const void *s2, unsigned n) • Compara los n primeros caracteres de s1 y s2 • Devuelve: – 0 si son iguales – <0 si s1 es menor que s2 – >0 si s1 es mayor que s2 Lenguajes de programación LPSI EUI UPM MANEJO DE MEMORIA – string.h void * memchr (const void *s1, int c, unsigned n) • Localiza la primera aparición del carácter c (convertido a unsigned char) entre los primeros n caracteres de s1 • Devuelve la dirección de s1 en la que está el carácter o NULL si no está void * memset (void *s1, int c, unsigned n) • Copia el carácter c (convertido a unsigned char) en los n primeros caracteres de s1 • Devuelve s1 Lenguajes de programación LPSI EUI UPM MANEJO DE CADENAS – string.h char * strcpy (char *s1, const char *s2) • Copia s2 en s1 • Devuelve s1 char * strncpy (char *s1, const char *s2, unsigned n) • Copia n caracteres de s2 en s1 • Devuelve s1 Lenguajes de programación LPSI EUI UPM MANEJO DE CADENAS – string.h char * strcat (char *s1, const char *s2) • Concatena s2 al final de s1 • El primer carácter de s2 se superpone al ‘\0’ de s1 • Devuelve s1 Lenguajes de programación LPSI EUI UPM MANEJO DE CADENAS – string.h char * strncat (char *s1, const char *s2) • Concatena n caracteres de s2 al final de s1 • El primer carácter de s2 se superpone al ‘\0’ de s1 • Devuelve s1 Lenguajes de programación LPSI EUI UPM MANEJO DE CADENAS – string.h int strcmp (const char *s1, const char *s2) • Compara la cadena s1 con s2 • Devuelve – 0 si son iguales – <0 si s1 es menor que s2 – >0 si s1 es mayor que s2 Lenguajes de programación LPSI EUI UPM MANEJO DE CADENAS – string.h int strncmp (const char *s1, const char *s2, unsigned n) • Compara un máximo de n caracteres de s1 y s2. Para si encuentra ‘\0’ antes de los n caracteres o si se puede determinar el resultado • Devuelve – 0 si son iguales – <0 si s1 es menor que s2 – >0 si s1 es mayor que s2 Lenguajes de programación LPSI EUI UPM MANEJO DE CADENAS – string.h char *strchr (const char *s1, int c) • Localiza la primera instancia del carácter c en s1 • Devuelve un puntero a c o NULL si no lo encuentra Lenguajes de programación LPSI EUI UPM MANEJO DE CADENAS – string.h unsigned strlen (const char *s1) * Devuelve la longitud de la cadena s1, sin contar el ‘\0’ Lenguajes de programación LPSI EUI UPM MANEJO DE CADENAS – string.h char *strstr (const char *s1, const char *s2) • Localiza la primera aparición de la cadena s2 en la cadena s1 • Devuelve la dirección de la cadena en s1 o NULL si no la encuentra char *strpbrk (const char *s1, const char *s2) • Localiza el primer carácter de s2 que esté en s1 • Devuelve la dirección en s1 del carácter encontrado o NULL si no encuentra ninguno Lenguajes de programación LPSI EUI UPM MANEJO DE CADENAS – string.h unsigned strspn (const char *s1, const char *s2) • Devuelve la longitud máxima de la subcadena inicial de s1 formada sólo por caracteres contenidos en s2 unsigned strcspn (const char *s1, const char *s2) • Devuelve la longitud máxima de la subcadena inicial de s1 formada sólo por caracteres que no están contenidos en s2 char *strrchr (const char *s1, int c) • Localiza la última instancia del carácter c en s1 • Devuelve un puntero a c o NULL si no lo encuentra Lenguajes de programación LPSI EUI UPM CONVERSIÓN DE CADENAS – stdlib.h double atof (const char *s1) • Convierte la cadena s1 a double int atoi (const char *s1) • Convierte la cadena s1 a int long atol (const char *s1) • Convierte la cadena s1 a long char *itoa (int n, char *s1, unsigned b) • Convierte el entero n en una cadena de caracteres, que la almacena en s1, en base b. La base tiene que estar en el rango 2..36 • Devuelve s1 Lenguajes de programación LPSI EUI UPM MANEJO DE CARACTERES – ctype.h int isdigit (int c) • Devuelve verdadero si c es un dígito y 0 en caso contrario int isalpha (int c) • Devuelve verdadero si c es una letra y 0 en caso contrario int isalnum(int c) • Devuelve verdadero si c es un dígito o una letra, y 0 en caso contrario int islower(int c) • Devuelve verdadero si c es una letra minúscula y 0 en caso contrario Lenguajes de programación LPSI EUI UPM MANEJO DE CARACTERES – ctype.h int isupper (int c) • Devuelve verdadero si c es una letra mayúscula y 0 en caso contrario int isspace (int c) • Devuelve verdadero si c es un carácter de espaciado (salto de línea ‘\n’, espacio en blanco ‘ ‘, línea siguiente ‘\f’, retorno de carro ‘\r’, tabulador horizontal ‘\t’ o tabulador vertical ‘\v’) y 0 en caso contrario int tolower (int c) • Si c es una letra mayúscula la convierte a minúscula, si no la devuelve sin modificar Lenguajes de programación LPSI EUI UPM MANEJO DE CARACTERES – ctype.h int toupper (int c) • Si c es una letra minúscula la convierte a mayúscula, si no la devuelve sin modificar int iscntrl (int c) • Devuelve verdadero si c es un carácter de control y 0 en caso contrario int ispunct (int c) • Devuelve verdadero si c es un carácter imprimible distinto a letra, dígito o espacio en blanco, y 0 en caso contrario Lenguajes de programación LPSI EUI UPM MANEJO DE CARACTERES – ctype.h int isprint (int c) • Devuelve verdadero si c es un carácter imprimible y 0 en caso contrario int isupper (int c) • Devuelve verdadero si c es un carácter imprimible distinto del espacio en blanco, y 0 en caso contrario Lenguajes de programación LPSI EUI UPM BIBLIOTECA ESTÁNDAR DE ENTRADA/SALIDA – stdio.h int getchar (void) • Devuelve el siguiente carácter de la entrada estándar (teclado normalmente) . Lo recoge después de pulsar intro. • Si hay un error de lectura devuelve EOF (-1) char *gets (char s1) • Lee caracteres de la entrada estándar hasta encontrar un salto de línea o el fin de fichero, que no los incluye, y los almacena en la cadena s1. Añade ‘\0’ al final. • Devuelve s1 si no hay error en la lectura y NULL en caso contrario fflush (stdin) limpia el buffer de teclado Lenguajes de programación LPSI EUI UPM BIBLIOTECA ESTÁNDAR DE ENTRADA/SALIDA – stdio.h int putchar (int c) • Imprime el carácter c en la salida estándar (pantalla normalmente) int puts (const char * s1) • Imprime la cadena de caracteres s1 en la salida estándar seguida de un salto de línea. Si tiene éxito devuelve un ‘\n’ y EOF en caso contrario int sprintf (char *s1, const char * formato, …) * Igual que printf pero deja la salida en la cadena s1 int scanf (char *s1, const char * formato, …) * Igual que scanf pero lee los datos de entrada de la cadena s1 en vez de leerlos de teclado Lenguajes de programación LPSI EUI UPM ENTRADA/SALIDA DE CONSOLA – conio.h (no compatible con windows) void clrscr(void) • Borra la pantalla y sitúa el cursor en la esquina superior izda int getch (void) • Devuelve el carácter leído de teclado sin esperar a que se pulse intro. No hace eco en la pantalla int getche (void) • Devuelve el carácter leído de teclado sin esperar a que se pulse intro. Hace eco en la pantalla int putch (int c) • Imprime el carácter c en la pantalla. Devuelve el carácter impreso o EOF en caso de error Lenguajes de programación LPSI EUI UPM EJERCICIOS • Implementar todas las funciones explicadas en el tema, que no pertenezcan a stdio.h o conio.h, y que no se hayan implementado como ejemplo. • Implementar una función que reciba como parámetro una cadena de caracteres y la devuelva invertida Lenguajes de programación LPSI EUI UPM • Escribir una función que reciba como parámetros dos matrículas de coche distintas con formato “E-DDDD-LLL” y devuelva la más antigua. • Escribir una función que lea un nombre y unos apellidos y los devuelva, en mayúsculas y encriptados, en una cadena de caracteres, de longitud máxima 50. Para encriptar, se sumará 3 al código ascii de las vocales y 7 al de cualquier otra letra o símbolo que aparezca en el nombre o apellidos. Lenguajes de programación LPSI EUI UPM • Escribir una función que recibiendo como parámetros un array de punteros a cadenas de caracteres y un número entero mayor o igual que 2, ordene el array alfabéticamente y devuelva un código de ejecución que será 0 si todo ha ido bien ó 1 en caso de error. Lenguajes de programación LPSI EUI UPM