Caracteres y Cadenas Funcionamiento y algunas funciones para su manipulación SESIÓN 6 Caracteres Declaración Sintaxis tipo_de_dato nombre; Ejemplo: char carac; Mónica E. García García 1 Caracteres Recordar que un carácter es una variable capaz de almacenar un símbolo el cual puede tomar el valor de: Una letra (mayúscula o minúscula) Un número (entre el 0 y 9) , Un carácter especial (puede ser \, , @, ?, > , +, etc k 7 Letra Número * o Carac. Especial Mónica E. García García Caracteres Ejemplo de lectura y salida void main() { char sexo; // Declaracion de un caracter printf(“\nDar sexo [M]asculino o [F]emenino”); //Algunas veces es necesario usar fflush(stdin); scanf(“%c”,&sexo); printf “El sexo fue %c”, sexo); } Mónica E. García García 2 Operaciones con Caracteres Inicialización y declaración “simultanea” char sexo=‘ M’; Inicialización /asignación sexo=‘ M’; Comparación entre variables o contra caracteres if ( sexo == ‘M’) printf(“Masculino”); if ( ‘N’ > ‘O’ ) printf( “La letra N es mayor a la letra O”); Mónica E. García García Operaciones con Caracteres Asignación de valores numéricos a un caracter Suponer char carac=‘ M’; si carac++; printf(“\nValor = %c”,carac); //La salida es N Suponer char carac=79; equivale a char carac=‘O’; si carac++; printf(“\nValor = %c”,carac); //La salida es P Recordar que las variables char (carácter) aceptan valores numéricos porque los caracteres son representados por valores del código ASCII, los cuales son valores enteros(ver al final tabla del código ASCII). Mónica E. García García 3 Funciones para Caracteres El argumento de las funciones siguientes debe de ser un carácter ( char c; )o bien su correspondiente valor numérico en ASCII. El valor de retorno es un int. Las funciones regresan un valor diferente de cero si el argumento satisface la condición y un valor igual a cero si no lo hace. islower(c) Determina si c (variable tipo caracter) es una letra minúscula isupper(c) Determina si c es una letra mayúscula isalpha(c) Determina si c es una letra mayúscula o minúscula isdigit(c) Determina si c es un dígito decimal isalnum(c) Determina si c es una letra mayúscula o minúscula o dígito decimal iscntrl(c) Determina si c es un carácter de control (como \n) isgraph(c) Determina si c es un carácter de impresión excepto espacio isprint(c) Determina si c es un carácter de impresión incluyendo espacio ispunct(c) Determina si c es un carácter de impresión excepto espacio, letra o dígito isspace(c) Determina si c es un espacio, avance de línea, nueva línea, retorno de carro, tabulador, tabulador vertical isxdigit(c) Determina si C es un dígito hexadecimal Nota. Se debe usar la librería ctype.h Mónica E. García García Funciones Verifica si es una letra int isalpha(int c); La función retornará un valor diferente de cero en caso de que sea una letra(ya sea mayúscula o minúscula). Ejemplo: #include <stdio.h> #include <ctype.h> void main() { char c = ‘a'; if (isalpha(c)) printf(”\n %c es una letra",c); else printf(”\n %c no es una letra",c); } Probar cambiando el valor de c por: ‘C’ , `?’ ‘4’; ‘c’ y observar los resultados. Mónica E. García García 4 Funciones Verifica si es un carácter numérico int isdigit(int c); La función retornará un valor diferente de cero en caso de que sea un número(entre 0 y 9). Ejemplo: Probar cambiando el valor de c por: ‘C’ , `?’ ‘8’; ‘.’ y observar los resultados. #include <stdio.h> #include <ctype.h> void main() { char c = ‘a'; if (isdigit(c)) printf(”\n %c es un dígito",c); else printf(”\n %c no es un dígito”,c); } Mónica E. García García Funciones Verifica si es una letra minúscula int islower(int c); La función retornará un valor diferente de cero en caso de que sea letra minúscula. Ejemplo (forma 2): Ejemplo: void main( ) { void main( ) { int num; char sexo= ‘ f ’; num= islower( sexo); if (num != 0 ) printf (“Minúscula %c”,sexo); char sexo= ‘ f ’; if (islower( sexo) != 0 ) printf (“Minúscula”); } } Mónica E. García García 5 Funciones de conversión MAY a min y de min a MAY Al igual que las funciones anteriores el resultado esperado es un número ,tipo int, diferente de cero. tolower(c) Convierte c a letra minúscula. toupper(c) Convierte c a letra mayúscula. //Ejemplo de toupper #include <string.h> #include <stdio.h> #include <ctype.h> void main() { int tam, i; char cade[ ]= ”un ejemplo"; tam = strlen(cade); for (i=0; i<tam; i++) { cade[i] = toupper(cade[i]); } printf(”\n Cambio= %s",cade); } Mónica E. García García Lectura de un carácter sin visualizacion int getchar(void); //Ejemplo #include <stdio.h> void main(void) { int c; //probar que c sea un char y observar el resultado while ((c = getchar()) != '\n') // La lectura se realizará hasta que se de un <enter> desde teclado printf("%c", c); } Mónica E. García García 6 Lectura de un carácter sin visualizacion int getch(void); Esta es una función no de ANSI C, sin embargo es mal utilizado para detener la pantalla de ejecución. Compiladores que trabajan para ambiente DOS lo soportan. Lo que hace es leer un caracter sin visualizarlo en pantalla y detecta un carácter del código extendido(por ejemplo las flechas arriba, abajo, etc.). Retorna el código del carácter leído. #include <conio.h> #include <stdio.h> void main( ) { int c; int extendido = 0; c = getch(); // La primer invocación (la que paraliza el programa a la espera del ingreso de la tecla) devuelve 0x00. if (!c) extendido = getch(); // La segunda invocación regresa el codigo del valor leido desde teclado. if (extendido) printf(”\nEl carácter es extendido "); else printf(” \n El carácter no es extendido "); } Mónica E. García García Cadenas Una cadena es una variable capaz de almacenar más de un símbolo. Dichos símbolos pueden tomar el valor de: Letras (mayúscula o minúscula) Números (entre el 0 y 9) , Caracteres especiales (puede ser \, , @, ?, > , +, el espacio en blanco , etc Una combinación de las anteriores Mónica E. García García 7 Cadenas Un cadena es un vector de caracteres por lo tanto gráficamente podemos representar una cadena de la siguiente forma: h o l a \0 . . . 0 2 1 3 4 . . . n Por lo que la definición de cadena se amplia : Una cadena en C es una secuencia de dos más caracteres finalizadas por un caracter NULL o \0: Mónica E. García García Declaraciones Diferentes tipo de declaración de una variable tipo caracter Como un vector char cad[10]; Como un vector sin dimensión char cade[ ]=“La Universidad”; Como un apuntador char *cade= “Programacion en C”; Mónica E. García García 8 Inicialización de las cadenas Inicialización de la variable cade dentro de la declaración char cade[5]="hola"; El código anterior es equivalente a: char cade[5]={'h','o','l','a','\0'}; Mónica E. García García Cadenas Ejemplo de lectura y salida void main() { char direccion[25]; // Declaracion de una cadena printf(“Dar dirección: ”); gets(direccion); printf “Tu dirección es %s”, direccion); } Mónica E. García García 9 Funciones para el manejo de cadenas Todas las funciones siguientes estan incluidas en la librería <string.h> Suponer que char s[15], ct[5]; e int n; strcpy(s,ct) Copia la cadena ct a s incuyendo '\0', regresa s. strncpy(s,ct,n) Copia hasta n caracteres de la cadena ct a s y regresa s, termina la cadena con '\0'. strcat(s,ct) Concatena ct al final de s y regresa s. strncat(s,ct,n) Concatena hasta n caracteres de la cadena ct a s, termina con '\0' y regresa s. Mónica E. García García Funciones para ... strcmp(cs,ct) Compara cs con ct. El valor de retorno es 0, cuando son idénticas un valor negativo, cuando cs<ct y positivo cuando cs>ct. strncmp(cs,ct,n) La misma tarea que la función anterior excepto que se compara hasta n caracteres. strchr(cs,c) Regresa un apuntador a la primera ocurrencia de c en cs, o NULL si no está presente. strrchr(cs,c) Regresa un apuntador a la última ocurrencia de c en cs, o NULL si no está presente. strlen(cs) Regresa la longitud (tipo int) de cs. Mónica E. García García 10 Ejemplos Ejemplo de la funcion strlen void main() { char cade[25]; int longitud; printf("Dar una frase: "); gets(cade); longitud = strlen(cade); printf("La longitud es de %d caracteres ",longitud); getch(); } Mónica E. García García Ejemplos Programa que ejemplifica el uso de strcpy void main() { char completo[45]; char m[2][4]={{'5','B','#','\0'},{'E','a','2'}}; char nom[10]="Julio", apat[10]="Ortega", amat[10]="Ruiz"; strcpy(completo,nom); printf("\n%s",completo); strcpy(completo,apat); printf("\n%s",completo); getch(); } Mónica E. García García 11 Ejemplos Ejemplo de la funcion strncat #include <string.h> #include <stdio.h> void main( ) { char destino[25 ]=“La casa”; char origen[ ] = ”abandonada"; strncat(destino, origen, 7); printf(”\n%s", destino); } Mónica E. García García Comparación de cierto número de caracteres int strncmp(const char *s1, const char *s2, size_t maxlen); El tercer parámetro indica el número de elementos a comparar entre las cadenas. #include <stdio.h> #include <string.h> void main( ) { char cad1[ ]= "aaabbb", cad2[ ]= "bbbccc", cad3[ ]= ”bbb"; int comp; comp = strncmp(cad2,cad1,3); if (comp > 0) printf(”\n Cadena 2 es mas grande que cadena 1 "); else printf(Cadena 1 es mas grande que cadena 2” ); comp = strncmp(cad2,cad3,3); if (comp > 0) printf(" \n Cadena 3 es mas grande que cadena 2 "); else { if (comp ==0 ) printf (“Cadenas iguales”); else printf(" \n Cadena 2 es mas grande que cadena 3 "); } } Mónica E. García García 12 Funciones de lectura y salida Además de scanf la lectura puede realizarse con gets y la salida con puts. int puts(const char *s); La función retorna un entero no negativo en caso de que la salida de la cadena se haya realizado correctamente en caso contrario retornara EOF**. char * gets(char *s); La función retornará una cadena(s) en caso de ser exitosa la lectura y NULL** en caso contrario. ** Términos que se manejaran en temas siguientes. Mónica E. García García Funciones de lectura y salida Ejemplo: #include <stdio.h> void main() { char c, mensaje[30]; int i = 0; puts( “Introducir una línea de texto: " ); // se lee carácter por carácter con getchar(); while ( ( c = getchar() ) != ‘\n') { mensaje[ i++ ] = c; } mensaje[i] = ‘\0'; //para terminar correctamente la cadena puts( ”\n La linea introducida fue = " ); puts( mensaje ); } Mónica E. García García 13 Otras funciones atoi, atof, pero éstas fueron presentadas en el material 3. itoa, convierte un entero a una cadena pero no es disponible para ANSI C. Mónica E. García García Tabla del código ASCII Mónica E. García García 14