Cadenas en C.pdf
Document Details
Uploaded by AmpleLorentz8676
2024
Tags
Full Transcript
Cadenas en C Programación II Plan 2023 Cadenas Una cadena es una secuencia de caracteres. En C las cadenas son arreglos unidimensionales de tipo char. En C las cadenas terminan en un carácter especial llamado carácter de fin de cadena que es el carácter cuyo có...
Cadenas en C Programación II Plan 2023 Cadenas Una cadena es una secuencia de caracteres. En C las cadenas son arreglos unidimensionales de tipo char. En C las cadenas terminan en un carácter especial llamado carácter de fin de cadena que es el carácter cuyo código ASCII es 0. El carácter de fin de cadena no forma parte de la cadena, sólo lo delimita. Para escribir el carácter de fin de cadena se puede utilizar la secuencia de escape ‘\0’ 22/02/2024 Manuel Domitsu Kono 2 Cadenas Constantes Una constante cadena es cualquier secuencia de caracteres encerradas entre comillas, por ejemplo: "\nHola" Las comillas no forman parte de la cadena, sólo la delimitan. C interpreta la construcción "\nHola" como la dirección base del arreglo en la que almacena la secuencia de caracteres que forman la constante. \n H o l a \0 1000 1001 1002 1003 1004 1005 22/02/2024 Manuel Domitsu Kono 3 Cadenas Variables Declaración de una variable tipo cadena: char nomCadena[tamCadena] [= cteCadena]; Ejemplos: char msj1; char msj2 = “\nHola"; \n H o l a \0 char msj3[] = “\nHola"; \n H o l a \0 char msj4 = {'\n', 'H', 'o', 'l', 'a', '\0'}; char msj4[] = {'\n', 'H', 'o', 'l', 'a', '\0'}; 22/02/2024 Manuel Domitsu Kono 4 Apuntadores a Constantes Cadena Declaración de un apuntador a constante cadena: char *pnomApuntador [= cteCadena]; Ejemplos: char msj1[] = "Hola"; char *pMsj1; char *pMsj2 = "Hola"; → H o l a \0 22/02/2024 Manuel Domitsu Kono 5 Apuntadores a Constantes Cadena Dadas las siguientes declaraciones: char msj[] = "Hola"; char *pMsj = "Hola"; Podemos acceder a los elementos de las dos cadenas usando indexamiento o apuntadores: msj y pMsj // ambas valen 'l'. *(msj+1) y *(pMsj+1) // ambas valen 'o'. puts(msj) y puts(pMsj) // ambas despliegan en // la pantalla la // cadena "Hola". 22/02/2024 Manuel Domitsu Kono 6 Apuntadores a Constantes Cadena Dadas las siguientes declaraciones: char msj[] = "Hola"; char *pMsj = "Hola"; Sin embargo msj es una constante y pMsj es un apuntador, por lo tanto: msj++; // Error, msj es una // dirección constante pMsj++; // Si es válido msj = "Adiós"; // Error, msj es // constante no podemos // modificarla pMsj = "Adiós"; // Sí es válido 22/02/2024 Manuel Domitsu Kono 7 Funciones para Manejo de Cadenas Todas las funciones de la Biblioteca Estándar para el manejo de cadenas respetan la convención de que las cadenas terminan en el carácter de fin de cadena. El archivo de cabecera es string.h 22/02/2024 Manuel Domitsu Kono 8 Funciones para Manejo de Cadenas char *strcpy(char *dest, const char *orig); Copia la cadena orig a la cadena dest. La función regresa un apuntador a dest. char *strncpy(char *dest, const char *orig, size_t n); Copia exactamente n caracteres de la cadena orig a la cadena dest. La función regresa un apuntador a dest. char *strcat(char *dest, const char *orig); Concatena la cadena orig a la cadena dest. La función regresa un apuntador a dest. char *strncat(char *dest, const char *orig, size_t n); Concatena cuando mucho n caracteres de la cadena orig a la cadena dest. La función regresa un apuntador a dest. 22/02/2024 Manuel Domitsu Kono 9 Funciones para Manejo de Cadenas int strcmp(const char *s1, const char *s2); Compara las cadenas s1 y s2 lexicográficamente. La función regresa un entero que es menor que 0 si s1 es menor que s2; Regresa 0 si s1 es igual a s2 y regresa un número que es mayor que 0 si s1 es mayor que s2. int strncmp(const char *s1, const char *s2, size_t n); Compara cuando mucho n caracteres de las cadenas s1 y s2 lexicográficamente. La función regresa un entero que es menor que 0 si en los primeros n caracteres s1 es menor que s2; Regresa 0 si en los primeros n caracteres s1 es igual a s2 y regresa un número que es mayor que 0 si en los primeros n caracteres s1 es mayor que s2. 22/02/2024 Manuel Domitsu Kono 10 Funciones para Manejo de Cadenas size_t strlen(const char *s); Calcula la longitud de la cadena s. Regresa el número de caracteres en s sin contar el carácter de fin de cadena char *strchr(const char *s, int c); Busca la primera ocurrencia del carácter c en la cadena s. La función regresa un apuntador a la primera ocurrencia del carácter c en s. Si c no ocurre en s la función regresa NULL. char *strstr(const char *s1, const char *s2); Busca la primera ocurrencia de la cadena s2 en la cadena s1. La función regresa un apuntador al carácter en s1 donde s2 empieza. Si s2 no ocurre en s1 la función regresa NULL. 22/02/2024 Manuel Domitsu Kono 11 Funciones para Manejo de Cadenas char *strupr(char *s); Convierte los caracteres en minúscula de la cadena s a mayúsculas. Los demás caracteres no se modifican. La función regresa un apuntador a s. char *strlwr(char *s); Convierte los caracteres minúsculos de la cadena s a mayúsculas. Los demás caracteres no se modifican. La función regresa un apuntador a s. char *strset(char *s, int c); Rellena los caracteres de la cadena s con el carácter c. La función regresa un apuntador a s. char *strrev(char *s); Invierte los caracteres de la cadena s. La función regresa un apuntador a s. 22/02/2024 Manuel Domitsu Kono 12 Funciones para Convertir Cadenas a Números int atoi(const char *s); Convierte una cadena a un entero. La función regresa el entero representado por la cadena s si se pudo convertir. En caso contrario regresa 0. La función reconoce caracteres en el siguiente orden: Una secuencia opcional de espacios y caracteres de tabulación. Un signo opcional (+ o -). Una secuencia de dígitos. No debe haber espacios ni caracteres de tabulación entre el signo y la secuencia de dígitos. En esta función, el primer carácter no reconocido termina la conversión. La función no prevé el sobreflujo. El archivo de cabecera es stdlib.h 22/02/2024 Manuel Domitsu Kono 13 Funciones para Convertir Cadenas a Números double atof(const char *s); Convierte una cadena a un doble. La función regresa el doble representado por la cadena s si se pudo convertir. En caso contrario regresa 0. La función reconoce caracteres en el siguiente orden: Una secuencia opcional de espacios y caracteres de tabulación. Un signo opcional (+ o -). Una secuencia de dígitos y un punto decimal opcional. Los dígitos pueden ir a ambos lados del punto decimal. Opcionalmente, el carácter e o E seguido de un entero con signo. En esta función, el primer carácter no reconocido termina la conversión. El archivo de cabecera es stdlib.h 22/02/2024 Manuel Domitsu Kono 14 Ejemplos sobre Funciones de Cadenas Se desea implementar un programa que implemente funciones para el manejo de cadenas. El programa contendrá dos módulos: Un módulo llamado funcionesCadenas con las siguientes funciones para el manejo de cadenas: Una función que se comporte como la función de la biblioteca estandar strcpy(). Una función que se comporte como la función de la biblioteca estandar strncpy(). 22/02/2024 Manuel Domitsu Kono 15 Ejemplos sobre Funciones de Cadenas Una función que se comporte como la función de la biblioteca estandar strcat(). Una función que se comporte como la función de la biblioteca estandar strcmp(). Una función que se comporte como la función de la biblioteca estandar strchr(). Una función que se comporte como la función de la biblioteca estandar strupr(). 22/02/2024 Manuel Domitsu Kono 16 Ejemplos sobre Funciones de Cadenas Un segundo módulo llamado cadenas contendrá la función main(). El código de la función main() hará lo siguiente: Copia la cadena "Hola" a la cadena msj. Copia, a lo más, los primeros dos caracteres de la cadena "Hola" a la cadena msj. Concatena a la cadena msj la cadena ", mundo". Compara las cadenas "perro" y "perro". Compara las cadenas "can" y "arbol". Compara las cadenas "casa" y "caza". 22/02/2024 Manuel Domitsu Kono 17 Ejemplos sobre Funciones de Cadenas Busca la primera ocurrencia del carácter ‘a’ en la cadena "entramado". Busca la primera ocurrencia del carácter ‘h’ en la cadena "entramado". Convierte la cadena "hola mundo" a mayúsculas. El código de este programa se encuentra en los archivos Ejemplos sobre Funciones de Cadenas. 22/02/2024 Manuel Domitsu Kono 18 Arreglos de Cadenas Son arreglos donde cada elemento del arreglo sea a su vez una cadena. Ejemplo char opcMenu[] = { "Altas", "Bajas", "Cambios", "Depurar“, "Iniciar", "Listar", "Salir"}; A l t a s \0 B a j a s \0 C a m b i o s \0 D e p u r a r \0 I n i c i a r \0 L i s t a r \0 S a l i r \0 19 22/02/2024 Manuel Domitsu Kono Arreglos de Cadenas El siguiente código despliega un menu de opciones: #include void despliegaMenu(char opcMenu[], int nOpc) { int i; puts(""); for(i = 0; i < nOpc; i++) puts(opcMenu[i]); } 20 22/02/2024 Manuel Domitsu Kono Arreglos de Apuntadores a Cadenas Son arreglos donde cada elemento del arreglo es un apuntador a una cadena. Ejemplo char *pOpcMenu[] = {"Altas", "Bajas", "Cambios", "Depurar“, "Iniciar", "Listar", "Salir"}; → A l t a s \0 → B a j a s \0 → C a m b i o s \0 → D e p u r a r \0 → I n i c i a r \0 → L i s t a r \0 → S a l i r \0 22/02/2024 Manuel Domitsu Kono 21 Apuntadores a Arreglos de Cadenas El siguiente código despliega un menu de opciones: #include void despliegaMenu(char *pOpcMenu [], int nOpc) { int i; puts(""); for(i = 0; i < nOpc; i++) puts(pOpcMenu[i]); } 22 22/02/2024 Manuel Domitsu Kono Ejemplo 1 sobre Arreglos de Apuntadores a Cadenas Crea un módulo llamado menu que contenga las siguientes funciones: void despliegaMenu(char *pOpcMenu[], int nOpc): que despliegue un menú. Las opciones del menú están en el arreglo de apuntadores a cadena dado por pOpcMenu y el número de opciones está dado por nOpc. int selOpcionMenu(char *pOpcMenu[], int nOpc): que permita seleccionar una opción del menú de opciones desplegado por la función despliegaMenu(), presionando la letra mayúscula que aparece en la opción. Las opciones del menú están en el arreglo de apuntadores a cadena dado por pOpcMenu y el número de opciones está dado por nOpc. La función regresa el índice de la opción seleccionada. Si el usuario teclea una letra que no corresponde a ninguna opción, la función regresa -1. 23 22/02/2024 Manuel Domitsu Kono Ejemplo 1 sobre Arreglos de Apuntadores a Cadenas static char buscaMayuscula(const char *s): que busca la primera ocurrencia de una letra mayúscula en la cadena s. La función regresa la letra mayúscula si la encuentra, el carácter de fin de cadena. ‘\n’, en caso contrario. Para probar las funciones anteriores se tiene un segundo módulo llamado demoMenu que contendrá la función main(). El código de la función main() desplegará un menú, permitirá que el usuario seleccione una opción del menú y desplegará la opción seleccionada. El código de este programa se encuentra en el archivo Ejemplos sobre Programas con Arreglos de Cadenas en C. 24 22/02/2024 Manuel Domitsu Kono Ejemplo 2 sobre Arreglos de Apuntadores a Cadenas Se requiere un programa que lea las matrículas (enteros), los nombres, cadenas de máximo 30 caracteres y las alturas (dobles) de un grupo de alumnos y realice lo siguiente: Lea las matrículas y las alturas de cada alumno y las almacene en los arreglos matriculas, nombres y alturas. Despliegue una tabla de las matrículas, los nombres y alturas de los alumnos Ordene los arreglos en orden ascendente por las matrículas. 25 22/02/2024 Manuel Domitsu Kono Ejemplo 2 sobre Arreglos de Apuntadores a Cadenas Despliegue una tabla de las matrículas, los nombres y alturas de los alumnos ordenados por matrícula Busque y despliegue los nombres y las alturas de los alumnos dadas sus matrículas. El programa deberá preguntar si se desea seguir consultando otra altura, hasta que el usuario indique que no. El programa tendrá dos módulos. 26 22/02/2024 Manuel Domitsu Kono Ejemplo 2 sobre Arreglos de Apuntadores a Cadenas El primer módulo llamado alturasUtils tendrá las siguientes funciones: leeDatos() que lea las matrículas (enteros) , los nombres, cadenas de máximo 30 caracteres y las alturas (dobles) de los alumnos de un grupo y las almacene en tres arreglos. La función deberá leer datos hasta que se dé una matrícula cero la cual indica fin de captura. La función regresa el número de alumnos por el mecanismo de return. despliegaDatos() que despliega una tabla de las matrículas, los nombres, y las alturas de los alumnos. ordSelecciónMatricula() que ordena en forma ascendente de las matrículas, los arreglos matriculas, nombres y alturas, por el algoritmo de selección. 27 22/02/2024 Manuel Domitsu Kono Ejemplo 2 sobre Arreglos de Apuntadores a Cadenas consultaMatricula() que se encargará de realizar las consultas de nombres y alturas por matrícula. Para buscar una matrícula, llama a la función busquedaSecuencialMatricula(). busquedaSecuencialMatricula() que busca secuencialmente una matrícula en el arreglo de matrículas. La función deberá regresar un entero, la posición de la matrícula si la encontró o -1 si no se encuentra. El segundo módulo llamado alturas8, será el módulo principal y tendrá la función main() que llamará a las funciones del módulo alturasUtils para implementar la funcionalidad del programa. El código de este programa se encuentra en el archivo Ejemplos sobre Programas con Arreglos de Cadenas en C. 28 22/02/2024 Manuel Domitsu Kono Argumentos en la Línea de Comando Un programa escrito en C puede recibir información en la línea de comando dotando a la función main() con dos parámetros en los cuales reciba dicha información al momento de iniciar su ejecución. int main(int argc) int main(int argc, char *argv[]) 29 22/02/2024 Manuel Domitsu Kono Argumentos en la Línea de Comando argc es el número de argumentos tecleados en la línea de comando, incluyendo el nombre del programa que se está ejecutando. argv es un arreglo de apuntadores a carácter. Estos apuntadores apuntan a cadenas que contienen los argumentos tecleados en la línea de comando. argv siempre apunta a una cadena que contiene el nombre del programa que se está ejecutando, los demás argumentos contienen los siguientes argumentos. Al teclear los argumentos, éstos se separan por uno o más espacios. 30 22/02/2024 Manuel Domitsu Kono Argumentos en la Línea de Comando El siguiente programa, llamado cl_args nos muestra el contenido de los diferentes parámetros de la función main(). #include #include int main(int argc, char** argv) { register int i; printf("\nargc = %d\n", argc); for (i = 0; i < argc; i++) printf("\nargv[%d] = %s", i, argv[i]); printf("\n\n"); return 0; } 31 22/02/2024 Manuel Domitsu Kono Ejemplo sobre Argumentos en la Línea de Comando Crea un programa llamado calcula que reciba en la línea de comando un número flotante, un carácter que represente una de las cuatro operaciones fundamentales y un segundo número. El programa deberá desplegar el resultado de la operación indicada. Por ejemplo si tecleamos en la línea de comando calcula 4.38 + 3.25 el programa desplegará 7.63, que es la suma de los dos números anteriores. El código de este programa se encuentra en el archivo Ejemplos sobre Programas con Argumentos en la Línea de Comando. 32 22/02/2024 Manuel Domitsu Kono