Taller de Programación en C 2008-II printf() Sentencias de Entrada/Salida • Función estándar de impresión en consola • Usa formatos de control para imprimir sus argumentos )%d: %d enteros t con signo i )%u: enteros sin signo )%c: caracteres )%f: punto flotante de precisión simple )%lf: punto flotante de precisión doble Daniel Herrera P. danherrera@udec.cl 2 printf() printf() )%e %E: notacion cientifica )%o: base octal )%s: cadena de caracteres )%x: base hexadecimal )%p: puntero )%ld: entero largo )%h: short • Constantes de caracter )\n: Salto de linea )\f: Salto de pagina )\r: Retorno de carro )\t: Tabulacion )\b: Retroceso )\’: Comilla simple )\”: Comillas 3 printf() 4 scanf() • Constantes de caracter • Funciones scanf() leen caracteres con un formato dado desde un flujo )\\: Barra invertida )\?: Interrogacion )%%: Signo % int scanf(char const *format, . . .); • Otros )%10f: Flotante con 10 enteros )%010f : Flotante con 10 enteros, espacios en 0 )%2.3f : Flotante con 2 enteros y 3 decimales 5 ©Daniel Herrera P. 1 Taller de Programación en C 2008-II scanf() scanf() • Función scanf() lee caracteres de la entrada estándar stdin • Función scanf() requiere punteros a áreas de memoria que reciben los datos leídos )Retornan el número de conversiones exitosas )EOF al encontrar fin del flujo )EOF, )Variables )Ristras )Punteros Formato de scanf() Códigos de formato scanf() • Función scanf() recibe un formato como argumento, que puede contener • Formato comienza con %, al que sigue: )Caracteres de espacio en blanco ` Espacio, Espacio tab, tab retorno de carro, carro avance de línea, línea etc. etc )Asterisco (opcional): indica que valor leído es desechado )Ancho (opcional): no puede ser negativo ` Si no está presente, se lee hasta el siguiente espacio en blanco )Códigos de formato )Otros caracteres ` Entrada debe ajustarse a estos caracteres )Código de formato scanf(“ %d:%f\n”, &a, &b); Formato de scanf() %c: caracter %d: entero decimal %i: decimal con base %u: decimal sin signo g %o: octal sin signo %x, %X: hexadecimal sin signo • %p: puntero • • • • • • ©Daniel Herrera P. • %f: punto flotante • %e, %E: punto flotante con formato E • %g, %G: punto flotante con formato G (%f ó %e) • %s: ristra • %: el caracter % Ejemplo int a, b, c; scanf(“%4d %4d %4d”, &a, &b, &c); Ante la entrada 12345 67890 67890, retorna a = 1234 b=5 c = 6789 2 Taller de Programación en C 2008-II Ristras Ristras • Ristras, cadenas ó strings )“Hola a todos” • Secuencia de 0 o más caracteres terminada por un 0 o NULL Daniel Herrera P. danherrera@udec.cl )No confundir 0 con ‘0’ )NULL termina ristra pero no forma parte de ella ` No es considerado en el largo de la ristra • Secuencias literales Funciones de ristras Largo de una ristra • Declaradas en <string.h> • Funciones de • Número de caracteres en la ristra )Largo ilimitado ` Largo L de d la l ristra i t dado d d por ell terminador t i d 0 )Largo limitado ` Largo de la ristra es argumento de la función )Sin contar el 0 size_t strlen(char const *string); )Retorna un valor de tipo size_t size t ` Definido en <stddef.h> como unsigned integer )Argumento es puntero a ristra constante ` Función no puede cambiar la ristra Operaciones con strlen() if (strlen(x) >= 10) if (strlen(x) – 10 >= 0) • No son iguales! )Resta de unsigned integers da un unsigned integer como resultado )Segunda expresión es siempre positiva! ` Forzar resultado a tener signo if ( (signed) strlen(x) – 10 >= 0) ©Daniel Herrera P. strcpy() char *strcpy(char *dst, char const *src) • Copia la ristra apuntada por *src a la dirección apuntada por *dst )Retorna puntero a dst )src es puntero constante )dst debe ser un ` vector de caracteres ` puntero a un vector ` puntero a memoria dinámica 3 Taller de Programación en C strcpy() • Cuándo termina la copia? )Al encontrar un byte 0 en la ristra origen 2008-II strcpy() char mensaje[] = “Hola”; char mensaje2[] = “Chao”; strcpy(mensaje, “Adios”); • Qué pasa si src y dst se traslapan? )Comportamiento indefinido • Qué pasa si dst es menor que src? )strcpy() sobreescribirá datos posteriores a dst strcat() char *strcat(char *dst, char const *src) • Concatena la ristra apuntada por *src a continuación de la ristra apuntada por *dst )Retorna puntero a dst )Comportamiento indefinido si src y dst se traslapan )Programador debe asegurarse de reservar suficiente espacio para ambas ristras strcmp() int strcmp(char const *s1, char const *s2) • Compara la ristra apuntada por *s1 con la ristra apuntada por *s2 )Comparación caracter a caracter según código ASCII ` Resultado es 0 si s1 es igual a s2 ` Resultado es < 0 si s1 < s2 ` Resultado es > 0 si s1 > s2 ©Daniel Herrera P. H o l a \0 C h a o \0 A d i o s \0 h a o \0 strcat() char mensaje[10] = “Hola”; strcat(mensaje, “Chao”); H o l a \0 H o l a C h a o \0 strncpy() char *strncpy(char const *dst, char const *src, size_t len) • Copia exactamente n caracteres de la ristra apuntada por *s1 * 1 a la ristra *s2 * 2 )Si strlen(src) < len, dst se llena con caracteres NULL )Si strlen(src) > len, dst recibe len caracteres ` NULL terminador se pierde! 4 Taller de Programación en C strncat() char *strncat(char const *dst, char const *src, size_t len) • Concatena hasta n caracteres de la ristra apuntada por *s1 * 1 a la ristra *s2 * 2 )Si strlen(src) < len, dst se llena con caracteres NULL )Si strlen(src) > len, dst recibe len caracteres 2008-II strncmp() int strncmp(char const *s1, char const *s1, size_t len) • Compara hasta n caracteres de la ristra apuntada por *s1 * 1 y de la ristra *s2 * 2 )Si los primeros len caracteres de ambas cadenas son iguales, función retorna 0 ` NULL terminador se pierde! strchr() char *strchr(char const *s, int c) • Revisa la ristra s de izquierda a derecha buscando el caracter c )Retorna un puntero a la primera ocurrencia del caracter )Retorna NULL si el caracter no está presente char *strrchr(char const *s, int c) )Lo mismo, pero revisa de derecha a izquierda strstr() char *strstr(char const *s1, char const *s2) • Revisa la ristra s1 de izquierda a derecha buscando la ristra s2 )Retorna un puntero al comienzo de s2 en s1 )Si s2 no aparece en s1, retorna NULL )Si s2 está vacío, retorna s1 ©Daniel Herrera P. strpbrk() char *strpbrk(char const *s, char const *grp) • Revisa la ristra s de izquierda a derecha buscando un caracter del grupo grp char s[20] = “Hola a todos”; char *p; p = strpbrk(s, “aeiou”); )Retorna un puntero a la primera ‘o’ strspn(), strcspn() size_t strspn(char const *s, char const *grp) • Cuenta cuántos caracteres de la ristra grp existen al comienzo de la ristra s len = strspn(buffer, “ \n\r\t\f\v”); )len cuenta cuántos caracteres blancos existen al comienzo de buffer )strcspn() es el complemento de strspn() 5 Taller de Programación en C strtok() char *strtok(char *str, char const *sep) • Busca tokens en la ristra str separados por caracteres de sep )Retorna un puntero al elemento encontrado )Si se repite llamada con *str igual a NULL, sigue buscando en ristra original )Modifica la ristra original *str strtok() printTokens(“(56)-(41)-234985”); ) Línea = “(56)-(41)-234985” ` 1er. token = “56” ) Línea = “)-(41)-234985” ` 2do. token = “41” ) Línea = “)-234985” ` 3er. token = “234985” ) Línea = “” ` 4to. token = NULL ) Iteración termina Conversión de ristras • Funciones para una base dada long int strtol(char const *s, char **resto, int base) unsigned long int strtoul(char const *s, char resto, int base) **resto )resto es puntero al próximo caracter a convertir ` resto puede ser NULL )Base puede estar entre 2 y 36 2008-II strtok() printTokens(char *linea){ char sep[] = “(-)”; char *token; for (token = strtok(linea, strtok(linea sep); token != NULL; token = strtok(NULL, sep)) { printf(“Token = %s\n”, token); } } Conversión de ristras • Declaraciones en <stdlib.h> • Funciones convierten ristras de caracteres en valores numéricos enteros • Funciones para base 10 int atoi(char const *s); long int atol(char const *s); )Ignora sufijos no numéricos )atoi(123abc) entrega 123 Conversión de ristras • Funciones convierten ristras de caracteres en valores numéricos de punto flotante )Declaraciones en <math.h> double atof(char const *s); s); double strtod(char const *s, char **resto); )resto es puntero al próximo caracter a convertir ` resto puede ser NULL ` Dígitos 0-9, A-Z ©Daniel Herrera P. 6 Taller de Programación en C Clasificación de caracteres • Declaraciones en <ctype.h> • Funciones reciben un entero conteniendo un caracter • Funciones retornan un valor entero para verdadero o falso int iscntrl(int c) Clasificación de caracteres )islower(): Verdadero si argumento es caracter entre a y z )isupper(): Verdadero si argumento es caracter entre A y Z )isalpha(): Verdadero si argumento es caracter entre a y z, o A y Z )isalnum(): Verdadero si argumento es caracter entre a y z, o A y Z, o 0 y 9 Transformación de caracteres )int tolower(int c): retorna su argumento como minúsculas )int toupper(int c): retorna su argumento como mayúsculas )Si argumento no es transformable, se retorna sin cambios 2008-II Clasificación de caracteres )iscntrl(): Verdadero si argumento es caracter de control )isspace(): Verdadero si argumento es caracter blanco (‘ ‘, ‘\f’, ‘\n’, ‘\t’, ‘\v’) )isdigit(): Verdadero si argumento es dígito entre 0 y9 )isxdigit(): Verdadero si argumento es dígito entre 0 y 9, a y f, o A y F Clasificación de caracteres )ispunct(): Verdadero si argumento es caracter de puntuación )isgraph(): Verdadero si argumento es caracter gráfico )isprint(): Verdadero si argumento es caracter imprimible (alfanumérico, puntuación, gráfico, espacio) Operaciones con memoria • Ristras terminan en byte de valor 0 • Cómo operar con áreas de memoria que pueden contener un 0? )Usar U funciones f i d de manejo j de d memoria i • Similares a funciones strnxxx() )No terminan al encontrar un NULL ©Daniel Herrera P. 7 Taller de Programación en C memcpy() char *memcpy(void *dst, void const *src, size_t length) • Copia length bytes del área apuntada por *src al área á apuntada por *dst *d t )Qué pasa si áreas se traslapan? ` Comportamiento indefinido int area1[numDatos], area2[numDatos]; memcpy(area2, area1, sizeof(area1)); memcmp() int memcmp(void *a, void const *b, size_t length) • Compara length bytes del área apuntada por *a con bytes del área apuntada por *b )Comparación se hace como unsigned char )Retorna 0 si secuencias son iguales, negativo si a < b, positivo si a > b 2008-II memmove() char *memmove(void *dst, void const *src, size_t length) • Copia length bytes del área apuntada por *src al área á apuntada por *dst *d t )Qué pasa si áreas se traslapan? ` Comportamiento correcto! )memmove() más lento que memcpy() memchr(), memrchr() void *memchr(void const *s, int c, size_t length) • Revisa length bytes del área apuntada por *s de izquierda a derecha buscando el caracter c )Retorna puntero a la primera ocurrencia del caracter )Retorna NULL si el caracter no está presente • *memrchr() hace lo mismo, pero revisa de derecha a izquierda memset() void *memset(void *s, int c, size_t length) • Inicializa length bytes del área apuntada por *s al caracter c )Retorna un puntero al área inicializada ©Daniel Herrera P. 8