Sentencias de Entrada/Salida

Anuncio
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
Descargar