SlideShare una empresa de Scribd logo
1 de 66
Descargar para leer sin conexión
1
03 – Entrada y salida en lenguaje C
Diego Andrés Alvarez Marín
Profesor Asociado
Universidad Nacional de Colombia
Sede Manizales
2
Temario
● Buffer de memoria
● Entrada/salida básica (stdio.h)
● Entrada/salida avanzada (ncurses.h)
3
Buffer
Un buffer (de datos) es un espacio de memoria, en el que se
almacenan datos para evitar que el programa o recurso que los
requiere, ya sea hardware o software, se quede sin datos durante una
transferencia.
Un buffer es como tener dinero en el banco (buffer), un trabajo
(entrada) y unos gastos fijos (salida). Si tienes un trabajo inestable,
mientras tengas ciertos ahorros, puedes mantener tus gastos fijos sin
problemas, e ir ingresando dinero cuando puedas según vas
trabajando. Si los ahorros son pequeños, en seguida que no tengas
trabajo, no vas a poder acometer los gastos fijos. De la misma forma si
escuchas música en Internet y tu programa de audio usa un buffer
pequeño, en cuanto que haya alguna interrupción en la descarga
(porque las descargas nunca tienen una velocidad constante), notarás
cortes de sonido, ya que faltará información.
El buffer de teclado es una memoria intermedia en la que se van
almacenando los caracteres que un usuario teclea, los cuales son
tratados por el computador apenas se libere un recurso.
4
Funciones de salida/entrada de
datos básicas
● Las provee la librería estándar stdio.h y no el
lenguaje mismo.
● stdio.h significa "standard input-output header"
(cabecera estandar E/S)
– stdin = standard input = teclado
– stdout = standard output = pantalla
– stderr = standard error
5
Funciones básicas de salida a
pantalla (stdout)
● Sin formato:
– putchar() escribe un carácter a stdout
– puts() escribe una cadena de caracteres a stdout
● Con formato:
– printf() escribe una cadena de caracteres con
formato a stdout
6
int putchar(int ch);
● Escribe un carácter en la pantalla (stdout)
● Retorna ch
a r
Backspace b f
t ”
Escape (solo GNU) e n
o x
Backslash  '
0 ?
Alerta (audible) Retorno de carro
Formfeed
Tabulador horizontal Comillas
Cambio de linea=rf
Número octal (ej: o32) Número hex (ej: xF3)
Apóstrofe
Nulo Pregunta
Algunos caracteres especiales
9
int puts(const char* str);
Escribe la cadena str a stdout y agrega automáticamente
un “n”. La cadena str termina cuando se encuentra un
carácter “0”. El “0” no se copia a stdout
10
int printf(const char* formato,...)
);
printf() retorna el número de caracteres
impresos, o un valor negativo si ocurre un
error.
printf() toma un número variable de entradas
11
int printf(const char* formato,...)
formato en printf()
● Es una cadena de texto que indica el formato
como se debe escribir lo deseado
● Sigue el siguiente prototipo:
%[banderas][ancho][.precisión][longitud]especificador
Ver detalles en:
http://pubs.opengroup.org/onlinepubs/009695399/functions
http://en.cppreference.com/w/cpp/io/c/fprintf
http://en.wikipedia.org/wiki/Format_string_attack
12
%[banderas][ancho][.precisión][longitud]especificador
Introducido en C99
Introducido en C99
Introducido en C99
13
%[banderas][ancho][.precisión][longitud]especificador
%[flags][width][.precision][length]specifier
14
%[banderas][ancho][.precisión][longitud]especificador
Introducido en C99
Introducido en C99
Introducido en C99
Introducido en C99
Introducido en C99
15
16
Un bug en MinGW
En Windows existe un bug en las funciones printf() y
scanf() con el formato tipo long o long long; por ejemplo:
scanf ("%llu n", &x); o printf("%llu n", x);
Generan el warning:
warning: unknown conversion type character 'l' in
format [-Wformat]
La solución es usar #include<inttypes.h> y
scanf("%"SCNu64"",&x); // entre comillas
printf("%"PRIu64"",UINT64_MAX);
Más información en:
http://stackoverflow.com/questions/10763854/printf-and
17Observe que el b no borró el guión -
18
Imprimir tildes en C
#include<locale.h>
setlocale(LC_ALL, “spanish”);
El estándar de codificación de
caracteres UNICODE
Se diseñó para facilitar el tratamiento informático,
transmisión y visualización de textos de múltiples
lenguajes y disciplinas técnicas, además de textos
clásicos de lenguas muertas. Unicode incluye sistemas
de escritura modernos como: árabe, braille, copto,
cirílico, griego, sinogramas (hanja coreano, hanzi chino y
kanji japonés), silabarios japoneses (hiragana y
katakana), hebreo y latino; escrituras históricas extintas,
para propósitos académicos, como por ejemplo:
cuneiforme, griego antiguo, fenicio y rúnico. Entre los
caracteres no alfabéticos incluidos en Unicode se
encuentran símbolos musicales y matemáticos, fichas de
juegos como el dominó, flechas, iconos etc.
El estándar de codificación de
caracteres UNICODE
● Se adoptó como norma ISO en 1993, como una
extensión de los códigos ASCII.
● Se tiene espacio para 1'114.112 símbolos posibles
(del 0x000000 al 0x10FFFF). Actualmente se usa la
versión 6.3 (Septiembre de 2013). Esta versión define
más de 110.000 símbolos.
● Los puntos de código se representan utilizando
notación hexadecimal agregando el prefijo U+. El
valor hexadecimal se completa con ceros hasta 4
dígitos hexadecimales cuando es necesario; si es de
longitud mayor que 4 dígitos no se agregan ceros.
Los símbolos UNICODE
http://www.unicode.org/charts/
● Se escriben como U+XXXXXX donde X es un
hexadecimal (esto se llama el code point).
● En C se representa tal Unicode como uXXXX (hasta
4 hexadecimales) o como UXXXXXX (hasta 6
hexadecimales)
● En GNU/Linux se escribe con Ctrl+Shift+u+codepoint
ENTER. Cuando esto se hace la letra u aparece
subrayada. Se debe tener una fuente apropiada
instalada.
● En MS Windows: ver la utilidad "charmap". Se debe
tener una fuente apropiada instalada.
http://unicode-table.com/en/sections/miscellaneous-symbols/
0 1 2 3 4 5 6 7 8 9 A B C D E F
23
Unicode
(no funciona
en Windows)
Nota: estos caracteres especiales
requiren más de un byte para su
almacenamiento
24
Funciones básicas de entrada
desde el teclado (stdin)
● Sin formato:
– getchar() lee un carácter desde stdin
– gets() lee una cadena de caracteres desde stdin
(C99 – desaconseja su uso, C11 – obsoleto)
– gets_s() lee una cadena de caracteres desde stdin
(es el reemplazo de gets())
● Con formato:
– scanf() lee una cadena de caracteres con formato
desde stdin
25
int scanf(const char* formato, ...);
● Lee datos del teclado (stdin) y lo almacena de
acuerdo al formato dado, en las direcciones de
memoria indicadas.
● De forma a similar a printf() puede leer un
número variable de entradas; en este caso se
supone que cada entrada está separada por un
espacio en blanco
● Ignora los espacios en blanco
● Retorna el número de items de la cadena de
argumentos exitosamente leídos o un EOF
(constante igual a -1) si un error ocurre.
26
int scanf(const char* formato, ...);
● El formato está dado por:
%[*][ancho][longitud]especificador
● Ver detalles en:
http://en.cppreference.com/w/cpp/io/c/fscanf
27
%[*][ancho][longitud]especificador
C99
C99
C99
28
%[*][width][length]specifier
(asteriscos porque la función scanf() espera punteros como argumentos)
29
Observe este
comportamiento inesperado!!
30
|
31
int getchar(void);
Lee un caracter desde el teclado (mostrándolo).
A pesar de todo estoy leyendo en un char
32
char* gets (char* str);
● El C99 no recomienda usar este comando. El
C11 lo vuelve obsoleto. La razón de esto es
que este comando hace vulnerable el programa
al ataque por hackers. Ver detalles en:
– http://en.cppreference.com/w/c/io/gets
– http://en.wikipedia.org/wiki/Buffer_overflow
– http://c-faq.com/stdio/getsvsfgets.html
33
char* gets (char* str);
Buffer overflow!!
Dirección char hex
0xbfd8935b 1 E 45
0xbfd8935c 2 j 6A
0xbfd8935d 3 e 65
0xbfd8935e 4 m 6D
0xbfd8935f 5 p 70
0xbfd89360 6 l 6C
0xbfd89361 7 o 6F
0xbfd89362 8 s 73
0xbfd89363 9 0 00
7565164 = 0x00736F6C
m.buf
m.i
Codificación
Little-endian
del número
entero m.i
34
char* gets_s(char *str, rsize_t n);
● Función sugerida en el C11, en reemplazo de
gets()
● Lee a lo más n-1 caracteres de stdin en la
cadena apuntada por str. Automáticamente
agrega el 0 al final de la cadena
● No está implementada todavía en el gcc v.4.6,
porque este aún no incorpora los cambios
sugeridos en el C11
35
Otro
reemplazo de
gets(): fgets()
strchr() busca
desde la dirección
buf hasta que
encuentra la
primera aparición
de un n. Se
retorna dicha
dirección de
memoria
36
¿Por qué este código
aparentemente
correcto no funciona?
Se presionó 20 (ENTER) y nada más.
El programa no me preguntó el nombre y terminó
37
Aquí el primer printf() pregunta la edad. Se escribe "20"
y se presiona ENTER. El buffer del teclado contiene:
2 0 n
El scanf() lee el %d, es decir el 20 y lo guarda en la
variable edad; sin embargo deja el 'n' en el buffer del
teclado; ahora entra el fgets() lee el 'n' y no alcanza a
leer el nombre. El problema es que scanf() dejó basura
en el buffer del teclado (concretamente el n).
Según http://c-faq.com/stdio/gets_flush2.html la solución
es vaciar el buffer del teclado lo cual se puede hacer
con alguno de los siguientes comandos:
● while((c = getchar()) != 'n' && c != EOF); //un ciclo vacío
● __fpurge(stdin); //solo funciona con gcc/Linux (stdio_ext.h)
● flushinp(); // si está manejando la librería curses.h
38
39
Nota con respecto a la entrada de
datos desde el teclado
scanf() no es muy versátil que digamos y tiene problemas
como el anteriormente mostrado. La mejor opción que se
tiene si se requiere seguridad procesando la entrada es
utilizar fgets(), sscanf() y/o alguna librería de regular
expressions: http://en.wikipedia.org/wiki/Regular_expression
No existen librerías de expresiones regulares en el estándar
de C, pero si algunas para ciertos sistemas como regex.h o
PCRE para UNIX/Linux:
http://www.lemoda.net/c/unix-regex/index.html
http://www.pcre.org/
Se podría también utilizar una interface con el comando de
consola grep.
40
41
Tomado de: http://xkcd.com/208/
NOTA: lenguajes como
PERL, PYTHON,
MATLAB tienen un muy
buen soporte para
expresiones regulares.
Les aconsejo
sinceramente aprender
a manejar las
expresiones regulares
cuando tengan
problemas con validar
entradas de texto, o
procesar una gran
cantidad de datos en
archivos. Es una
herramienta que los
puede sacar de apuros
en más de una
ocasión.
42
Preferiblemente no use scanf()
http://c-faq.com/stdio/scanfprobs.html
Una buena interface debe permitir la posibilidad
que el usuario entre errores: por ejemplo letras en
un campo donde se piden números, más o menos
caracteres que los esperados, etc. scanf() no es
capaz de tratar este tipo de situaciones. Por lo
tanto, se sugiere mejor utilizar fgets() y luego
interpretar lo leído utilizando sscanf() y/o algunas
otras técnicas como expresiones regulares.
Funciones como strtol(), strtok(), y atoi() son
bastante útiles.
43
La librería inttypes.h
Cuando se quieren imprimir (printf())o leer
(scanf()) el tipo de números definidos en stdint.h,
se deben ajustar las cadenas de texto con los
formatos, para que funcionen con estos tipos de
datos. inttypes.h se encarga de esto.
Tenga en cuenta que la librería inttypes.h llama
automáticamente a stdint.h
44
Los símbolos de printf() y scanf()
definidos por inttypes.h
El N en cursiva es 8, 16, 32 o 64 bits
45
Ejemplo con inttypes.h
Desde este punto de vista PRIx8 es un formato que se le agrega a
printf() para que este muestre hexadecimales de 8 bits.
Observe que se utilizó implícitamente la concatenación de cadenas.
46
Funciones de salida/entrada de
datos básicas <curses.h>
● curses.h es una biblioteca que provee rutinas
de entrada/salida avanzadas y que permite al
programador escribir interfaces basadas en
texto.
● Fue creada por Ken Arnold para el sistema
UNIX BSD. Sin embargo, existen
implementaciones para Linux (ncurses.h) y
para Windows (pdcurses.h).
● Permite manejar detalladamente la pantalla,
manejar el mouse, crear interfaces de texto
amigables.
47Tomada de: http://dmcradio.sourceforge.net/
48
49
Instalación en Windows de
pdcurses
● Descargue de: http://pdcurses.sourceforge.net/
● Lea las instrucciones de instalación.
● O si está utilizando el MinGW, simplemente en
la línea de comandos escriba:
mingw-get install mingw32-libpdcurses mingw32-pdcurses
50
Configuración del PDCURSES en
Codeblocks para Windows
51
Configuración del PDCURSES en
Codeblocks para Windows
52
Configuración del PDCURSES en
Codeblocks para Windows
53
Configuración del PDCURSES en
Codeblocks para Windows
54
Configuración del PDCURSES en
Codeblocks para Windows
Si le aparece este error copie el archivo libpdcurses.dll en
la misma carpeta donde está el archivo .exe de su
proyecto.
55
En Linux
● Instale la librería libncurses5-dev o similar, ej.:
$ sudo apt-get install libncurses5-dev
● Verifique que los siguientes archivos existan:
●
●
●
●
● Observe que en este caso ncurses.h y curses.h
son el mismo archivo
56
Tutorial de ncurses.h
● Se sugiere mirar el siguiente tutorial:
http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/
● Los siguientes programas están basados en
dicho tutorial.
57
Un primer ejemplo
Si no se pone este comando, la consola se comportará
de modo extraño. En linux esto se arregla con el
comando de consola reset. De todos modos se debe
poner siempre endwin().
ncurses.h en linux
curses.h en windows -lncurses en linux
-lpdcurses en windows
58
sin tener que dar ENTER
59
60
Colores con
ncurses
61
Caracteres
especiales
62
Teclas no alfanuméricas
63
Uso del mouse con ncurses.h
Ver el código:
http://programaciondecomputadoresunalmzl.wikispaces.com/file/detail/03_mouse_curses.c
64
Otros comandos de curses.h
● int addch(const chtype letra_char);
● int mvaddch(int y, int x, const chtype letra_char);
● int move(int y, int x);
● chtype inch(void);
● int mvprintw(int y, int x, char *format, ...);
● int getstr(char* string);
65
Programación de juegos
Existen varias librerías especialmente diseñadas
para programar juegos. Estas librerías contienen
funciones para el manejo de gráficos 2D y 3D,
sonidos, joystick, etc. Algunas de las más
populares son:
Allegro: http://alleg.sourceforge.net/
ClanLib: http://clanlib.org/wiki/Main_Page
OpenGL: http://www.opengl.org/
SDL: http://www.libsdl.org/
SFML: http://www.sfml-dev.org/
Material basado en:
● http://www.slideshare.net/amraldo/introduction-to-c-programming-7898353
● http://www.slideshare.net/petdance/just-enough-c-for-open-source-program
● http://www.cplusplus.com/reference/cstdio/printf/
● http://www.cplusplus.com/reference/cstdio/scanf/
● http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1049157810&id
● http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/
● Wikipedia

Más contenido relacionado

La actualidad más candente

Función real de la variable real y u representación gráfica
Función real de la variable real y u representación gráficaFunción real de la variable real y u representación gráfica
Función real de la variable real y u representación gráficabrayancoscorivera
 
Aplicaciones del cálculo a la ingeniería
Aplicaciones del cálculo a la ingenieríaAplicaciones del cálculo a la ingeniería
Aplicaciones del cálculo a la ingenieríaAbel Rivera Cervantes
 
DERIVADAS PARCIALES DE ORDEN SUPERIOR
DERIVADAS PARCIALES DE ORDEN SUPERIORDERIVADAS PARCIALES DE ORDEN SUPERIOR
DERIVADAS PARCIALES DE ORDEN SUPERIOREthel Sullcaray
 
Serie Fibonacci en C
Serie Fibonacci en CSerie Fibonacci en C
Serie Fibonacci en CAbraham
 
Series de taylor y fourier
Series de taylor y fourierSeries de taylor y fourier
Series de taylor y fouriernilsa
 
Volumen de solidos_de_revolucion
Volumen de solidos_de_revolucionVolumen de solidos_de_revolucion
Volumen de solidos_de_revolucionEdixon Urquiola
 
Ejercicios de análisis de regresión múltiple
Ejercicios de análisis de regresión múltipleEjercicios de análisis de regresión múltiple
Ejercicios de análisis de regresión múltipleAlberth ibañez Fauched
 
Curvas y superficies de nivel, trazado de funciones de 2 variables
Curvas y superficies de nivel, trazado de funciones de 2 variablesCurvas y superficies de nivel, trazado de funciones de 2 variables
Curvas y superficies de nivel, trazado de funciones de 2 variablesDaniel Orozco
 
Tema 2 ECUACIONES DIFERENCIALES LINEALES DE ORDEN SUPERIOR
Tema 2 	ECUACIONES DIFERENCIALES LINEALES DE ORDEN SUPERIORTema 2 	ECUACIONES DIFERENCIALES LINEALES DE ORDEN SUPERIOR
Tema 2 ECUACIONES DIFERENCIALES LINEALES DE ORDEN SUPERIORfederico paniagua
 
Reglas diferenciales y derivadas
Reglas diferenciales y derivadasReglas diferenciales y derivadas
Reglas diferenciales y derivadaseHdward
 
Representación matricial
Representación matricialRepresentación matricial
Representación matricialSam Rdgz
 
Base y dimension de los espacios vectoriales
Base y dimension de los espacios vectorialesBase y dimension de los espacios vectoriales
Base y dimension de los espacios vectorialesManuel Alejandro Garza
 
Maximos y minimos funcion de varias variables
Maximos y minimos funcion de varias variablesMaximos y minimos funcion de varias variables
Maximos y minimos funcion de varias variablesRAQUEL CARDENAS GONZALEZ
 
VECTOR TANGENTE NORMAL Y BINORMAL
VECTOR TANGENTE NORMAL Y BINORMALVECTOR TANGENTE NORMAL Y BINORMAL
VECTOR TANGENTE NORMAL Y BINORMALMario Muruato
 
Funciones en varias variables, una introduccion
Funciones en varias variables, una introduccionFunciones en varias variables, una introduccion
Funciones en varias variables, una introduccioneecoronado
 

La actualidad más candente (20)

Función real de la variable real y u representación gráfica
Función real de la variable real y u representación gráficaFunción real de la variable real y u representación gráfica
Función real de la variable real y u representación gráfica
 
Analisis gráfico de las funciones
Analisis gráfico de las funcionesAnalisis gráfico de las funciones
Analisis gráfico de las funciones
 
Aplicaciones del cálculo a la ingeniería
Aplicaciones del cálculo a la ingenieríaAplicaciones del cálculo a la ingeniería
Aplicaciones del cálculo a la ingeniería
 
DERIVADAS PARCIALES DE ORDEN SUPERIOR
DERIVADAS PARCIALES DE ORDEN SUPERIORDERIVADAS PARCIALES DE ORDEN SUPERIOR
DERIVADAS PARCIALES DE ORDEN SUPERIOR
 
Integrales dobles
Integrales doblesIntegrales dobles
Integrales dobles
 
Serie Fibonacci en C
Serie Fibonacci en CSerie Fibonacci en C
Serie Fibonacci en C
 
Series de taylor y fourier
Series de taylor y fourierSeries de taylor y fourier
Series de taylor y fourier
 
Volumen de solidos_de_revolucion
Volumen de solidos_de_revolucionVolumen de solidos_de_revolucion
Volumen de solidos_de_revolucion
 
Ejercicios de análisis de regresión múltiple
Ejercicios de análisis de regresión múltipleEjercicios de análisis de regresión múltiple
Ejercicios de análisis de regresión múltiple
 
Curvas y superficies de nivel, trazado de funciones de 2 variables
Curvas y superficies de nivel, trazado de funciones de 2 variablesCurvas y superficies de nivel, trazado de funciones de 2 variables
Curvas y superficies de nivel, trazado de funciones de 2 variables
 
Tema 2 ECUACIONES DIFERENCIALES LINEALES DE ORDEN SUPERIOR
Tema 2 	ECUACIONES DIFERENCIALES LINEALES DE ORDEN SUPERIORTema 2 	ECUACIONES DIFERENCIALES LINEALES DE ORDEN SUPERIOR
Tema 2 ECUACIONES DIFERENCIALES LINEALES DE ORDEN SUPERIOR
 
Probabilidad
ProbabilidadProbabilidad
Probabilidad
 
4 extremos
4 extremos4 extremos
4 extremos
 
Reglas diferenciales y derivadas
Reglas diferenciales y derivadasReglas diferenciales y derivadas
Reglas diferenciales y derivadas
 
Representación matricial
Representación matricialRepresentación matricial
Representación matricial
 
Base y dimension de los espacios vectoriales
Base y dimension de los espacios vectorialesBase y dimension de los espacios vectoriales
Base y dimension de los espacios vectoriales
 
Maximos y minimos funcion de varias variables
Maximos y minimos funcion de varias variablesMaximos y minimos funcion de varias variables
Maximos y minimos funcion de varias variables
 
Distribuciones de probalidad
Distribuciones de probalidadDistribuciones de probalidad
Distribuciones de probalidad
 
VECTOR TANGENTE NORMAL Y BINORMAL
VECTOR TANGENTE NORMAL Y BINORMALVECTOR TANGENTE NORMAL Y BINORMAL
VECTOR TANGENTE NORMAL Y BINORMAL
 
Funciones en varias variables, una introduccion
Funciones en varias variables, una introduccionFunciones en varias variables, una introduccion
Funciones en varias variables, una introduccion
 

Similar a 03 - Entrada y salida en lenguaje C

Chuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantesChuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantesAbrirllave
 
Entrada y salida de datos en c
Entrada y salida de datos en cEntrada y salida de datos en c
Entrada y salida de datos en cDenisse C
 
Fpr Tema 4 www.fresymetal.com
Fpr Tema 4 www.fresymetal.comFpr Tema 4 www.fresymetal.com
Fpr Tema 4 www.fresymetal.comFresyMetal
 
Introducción a la programación y la informática. Tema 7
Introducción a la programación y la informática. Tema 7Introducción a la programación y la informática. Tema 7
Introducción a la programación y la informática. Tema 7Andres Garcia Garcia
 
1 entrada y salida estandar(1)
1 entrada y salida estandar(1)1 entrada y salida estandar(1)
1 entrada y salida estandar(1)Arely Ramirez Mar
 
Entrada y salida de datos en c
Entrada y salida de datos en cEntrada y salida de datos en c
Entrada y salida de datos en cDenisse C
 
Generación código intermedio 2
Generación código intermedio 2Generación código intermedio 2
Generación código intermedio 2Humano Terricola
 
Tema 2. E_S Estructuras de Control 19-02-23.pdf
Tema 2. E_S Estructuras de Control 19-02-23.pdfTema 2. E_S Estructuras de Control 19-02-23.pdf
Tema 2. E_S Estructuras de Control 19-02-23.pdfNoe Castillo
 
introducción a la programación utilizando C++.pptx
introducción a la programación utilizando C++.pptxintroducción a la programación utilizando C++.pptx
introducción a la programación utilizando C++.pptxErisbeymarin
 
Lectura de cadenas en c
Lectura de cadenas en cLectura de cadenas en c
Lectura de cadenas en cjbersosa
 
1 Presentación microprocesador 8088.pptx
1 Presentación microprocesador 8088.pptx1 Presentación microprocesador 8088.pptx
1 Presentación microprocesador 8088.pptxGonzaloGutierrez75
 
Introduccion allenguajedeprogramacion
Introduccion allenguajedeprogramacionIntroduccion allenguajedeprogramacion
Introduccion allenguajedeprogramacionyubert
 
Debug PaulinaChacon
Debug PaulinaChaconDebug PaulinaChacon
Debug PaulinaChaconPau22
 

Similar a 03 - Entrada y salida en lenguaje C (20)

Chuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantesChuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantes
 
03 - Cadenas en Python 3
03 - Cadenas en Python 303 - Cadenas en Python 3
03 - Cadenas en Python 3
 
10 entrada y salida
10 entrada y salida10 entrada y salida
10 entrada y salida
 
Entrada y salida de datos en c
Entrada y salida de datos en cEntrada y salida de datos en c
Entrada y salida de datos en c
 
Fpr Tema 4 www.fresymetal.com
Fpr Tema 4 www.fresymetal.comFpr Tema 4 www.fresymetal.com
Fpr Tema 4 www.fresymetal.com
 
Introducción a la programación y la informática. Tema 7
Introducción a la programación y la informática. Tema 7Introducción a la programación y la informática. Tema 7
Introducción a la programación y la informática. Tema 7
 
1 entrada y salida estandar(1)
1 entrada y salida estandar(1)1 entrada y salida estandar(1)
1 entrada y salida estandar(1)
 
Mars
MarsMars
Mars
 
Mars
MarsMars
Mars
 
Entrada y salida de datos en c
Entrada y salida de datos en cEntrada y salida de datos en c
Entrada y salida de datos en c
 
Generación código intermedio 2
Generación código intermedio 2Generación código intermedio 2
Generación código intermedio 2
 
Unidad-2.pptx.pdf
Unidad-2.pptx.pdfUnidad-2.pptx.pdf
Unidad-2.pptx.pdf
 
Tema 2. E_S Estructuras de Control 19-02-23.pdf
Tema 2. E_S Estructuras de Control 19-02-23.pdfTema 2. E_S Estructuras de Control 19-02-23.pdf
Tema 2. E_S Estructuras de Control 19-02-23.pdf
 
introducción a la programación utilizando C++.pptx
introducción a la programación utilizando C++.pptxintroducción a la programación utilizando C++.pptx
introducción a la programación utilizando C++.pptx
 
Lectura de cadenas en c
Lectura de cadenas en cLectura de cadenas en c
Lectura de cadenas en c
 
Fundamentos de Lenguaje C
Fundamentos de Lenguaje CFundamentos de Lenguaje C
Fundamentos de Lenguaje C
 
1 Presentación microprocesador 8088.pptx
1 Presentación microprocesador 8088.pptx1 Presentación microprocesador 8088.pptx
1 Presentación microprocesador 8088.pptx
 
Introduccion allenguajedeprogramacion
Introduccion allenguajedeprogramacionIntroduccion allenguajedeprogramacion
Introduccion allenguajedeprogramacion
 
Tipos de datos para C++
Tipos de datos para C++Tipos de datos para C++
Tipos de datos para C++
 
Debug PaulinaChacon
Debug PaulinaChaconDebug PaulinaChacon
Debug PaulinaChacon
 

Más de Diego Andrés Alvarez Marín

Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...Diego Andrés Alvarez Marín
 
01 - Introducción al lenguaje de programación Python 3
01 - Introducción al lenguaje de programación Python 301 - Introducción al lenguaje de programación Python 3
01 - Introducción al lenguaje de programación Python 3Diego Andrés Alvarez Marín
 
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...Diego Andrés Alvarez Marín
 
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...Diego Andrés Alvarez Marín
 
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
02 - Conceptos fundamentales sobre tipos de datos en lenguaje CDiego Andrés Alvarez Marín
 
07 – Estimación puntual e introducción a la estadística inferencial
07 – Estimación puntual e introducción a la estadística inferencial07 – Estimación puntual e introducción a la estadística inferencial
07 – Estimación puntual e introducción a la estadística inferencialDiego Andrés Alvarez Marín
 
00/01 - Introduccion al curso y a la estadística descriptiva
00/01 - Introduccion al curso y a la estadística descriptiva00/01 - Introduccion al curso y a la estadística descriptiva
00/01 - Introduccion al curso y a la estadística descriptivaDiego Andrés Alvarez Marín
 

Más de Diego Andrés Alvarez Marín (17)

Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
 
02 - Tipos de datos escalares en Python 3
02 - Tipos de datos escalares en Python 302 - Tipos de datos escalares en Python 3
02 - Tipos de datos escalares en Python 3
 
01 - Introducción al lenguaje de programación Python 3
01 - Introducción al lenguaje de programación Python 301 - Introducción al lenguaje de programación Python 3
01 - Introducción al lenguaje de programación Python 3
 
06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C
 
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
 
05 - Funciones en lenguaje C
05 - Funciones en lenguaje C05 - Funciones en lenguaje C
05 - Funciones en lenguaje C
 
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
 
08 - Punteros en lenguaje C
08 - Punteros en lenguaje C08 - Punteros en lenguaje C
08 - Punteros en lenguaje C
 
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
 
01 - Introducción al lenguaje C
01 - Introducción al lenguaje C01 - Introducción al lenguaje C
01 - Introducción al lenguaje C
 
07 – Estimación puntual e introducción a la estadística inferencial
07 – Estimación puntual e introducción a la estadística inferencial07 – Estimación puntual e introducción a la estadística inferencial
07 – Estimación puntual e introducción a la estadística inferencial
 
06 - Variables aleatorias conjuntas
06 - Variables aleatorias conjuntas06 - Variables aleatorias conjuntas
06 - Variables aleatorias conjuntas
 
05 - Funciones de densidad de probabilidad
05 - Funciones de densidad de probabilidad05 - Funciones de densidad de probabilidad
05 - Funciones de densidad de probabilidad
 
04 - Funciones de distribución discretas
04 - Funciones de distribución discretas04 - Funciones de distribución discretas
04 - Funciones de distribución discretas
 
03 Variable Aleatoria
03   Variable Aleatoria03   Variable Aleatoria
03 Variable Aleatoria
 
02 - Introducción a la teoría de probabilidad
02 - Introducción a la teoría de probabilidad02 - Introducción a la teoría de probabilidad
02 - Introducción a la teoría de probabilidad
 
00/01 - Introduccion al curso y a la estadística descriptiva
00/01 - Introduccion al curso y a la estadística descriptiva00/01 - Introduccion al curso y a la estadística descriptiva
00/01 - Introduccion al curso y a la estadística descriptiva
 

03 - Entrada y salida en lenguaje C

  • 1. 1 03 – Entrada y salida en lenguaje C Diego Andrés Alvarez Marín Profesor Asociado Universidad Nacional de Colombia Sede Manizales
  • 2. 2 Temario ● Buffer de memoria ● Entrada/salida básica (stdio.h) ● Entrada/salida avanzada (ncurses.h)
  • 3. 3 Buffer Un buffer (de datos) es un espacio de memoria, en el que se almacenan datos para evitar que el programa o recurso que los requiere, ya sea hardware o software, se quede sin datos durante una transferencia. Un buffer es como tener dinero en el banco (buffer), un trabajo (entrada) y unos gastos fijos (salida). Si tienes un trabajo inestable, mientras tengas ciertos ahorros, puedes mantener tus gastos fijos sin problemas, e ir ingresando dinero cuando puedas según vas trabajando. Si los ahorros son pequeños, en seguida que no tengas trabajo, no vas a poder acometer los gastos fijos. De la misma forma si escuchas música en Internet y tu programa de audio usa un buffer pequeño, en cuanto que haya alguna interrupción en la descarga (porque las descargas nunca tienen una velocidad constante), notarás cortes de sonido, ya que faltará información. El buffer de teclado es una memoria intermedia en la que se van almacenando los caracteres que un usuario teclea, los cuales son tratados por el computador apenas se libere un recurso.
  • 4. 4 Funciones de salida/entrada de datos básicas ● Las provee la librería estándar stdio.h y no el lenguaje mismo. ● stdio.h significa "standard input-output header" (cabecera estandar E/S) – stdin = standard input = teclado – stdout = standard output = pantalla – stderr = standard error
  • 5. 5 Funciones básicas de salida a pantalla (stdout) ● Sin formato: – putchar() escribe un carácter a stdout – puts() escribe una cadena de caracteres a stdout ● Con formato: – printf() escribe una cadena de caracteres con formato a stdout
  • 6. 6 int putchar(int ch); ● Escribe un carácter en la pantalla (stdout) ● Retorna ch
  • 7. a r Backspace b f t ” Escape (solo GNU) e n o x Backslash ' 0 ? Alerta (audible) Retorno de carro Formfeed Tabulador horizontal Comillas Cambio de linea=rf Número octal (ej: o32) Número hex (ej: xF3) Apóstrofe Nulo Pregunta Algunos caracteres especiales
  • 8.
  • 9. 9 int puts(const char* str); Escribe la cadena str a stdout y agrega automáticamente un “n”. La cadena str termina cuando se encuentra un carácter “0”. El “0” no se copia a stdout
  • 10. 10 int printf(const char* formato,...) ); printf() retorna el número de caracteres impresos, o un valor negativo si ocurre un error. printf() toma un número variable de entradas
  • 11. 11 int printf(const char* formato,...) formato en printf() ● Es una cadena de texto que indica el formato como se debe escribir lo deseado ● Sigue el siguiente prototipo: %[banderas][ancho][.precisión][longitud]especificador Ver detalles en: http://pubs.opengroup.org/onlinepubs/009695399/functions http://en.cppreference.com/w/cpp/io/c/fprintf http://en.wikipedia.org/wiki/Format_string_attack
  • 14. 14 %[banderas][ancho][.precisión][longitud]especificador Introducido en C99 Introducido en C99 Introducido en C99 Introducido en C99 Introducido en C99
  • 15. 15
  • 16. 16 Un bug en MinGW En Windows existe un bug en las funciones printf() y scanf() con el formato tipo long o long long; por ejemplo: scanf ("%llu n", &x); o printf("%llu n", x); Generan el warning: warning: unknown conversion type character 'l' in format [-Wformat] La solución es usar #include<inttypes.h> y scanf("%"SCNu64"",&x); // entre comillas printf("%"PRIu64"",UINT64_MAX); Más información en: http://stackoverflow.com/questions/10763854/printf-and
  • 17. 17Observe que el b no borró el guión -
  • 18. 18 Imprimir tildes en C #include<locale.h> setlocale(LC_ALL, “spanish”);
  • 19. El estándar de codificación de caracteres UNICODE Se diseñó para facilitar el tratamiento informático, transmisión y visualización de textos de múltiples lenguajes y disciplinas técnicas, además de textos clásicos de lenguas muertas. Unicode incluye sistemas de escritura modernos como: árabe, braille, copto, cirílico, griego, sinogramas (hanja coreano, hanzi chino y kanji japonés), silabarios japoneses (hiragana y katakana), hebreo y latino; escrituras históricas extintas, para propósitos académicos, como por ejemplo: cuneiforme, griego antiguo, fenicio y rúnico. Entre los caracteres no alfabéticos incluidos en Unicode se encuentran símbolos musicales y matemáticos, fichas de juegos como el dominó, flechas, iconos etc.
  • 20. El estándar de codificación de caracteres UNICODE ● Se adoptó como norma ISO en 1993, como una extensión de los códigos ASCII. ● Se tiene espacio para 1'114.112 símbolos posibles (del 0x000000 al 0x10FFFF). Actualmente se usa la versión 6.3 (Septiembre de 2013). Esta versión define más de 110.000 símbolos. ● Los puntos de código se representan utilizando notación hexadecimal agregando el prefijo U+. El valor hexadecimal se completa con ceros hasta 4 dígitos hexadecimales cuando es necesario; si es de longitud mayor que 4 dígitos no se agregan ceros.
  • 21. Los símbolos UNICODE http://www.unicode.org/charts/ ● Se escriben como U+XXXXXX donde X es un hexadecimal (esto se llama el code point). ● En C se representa tal Unicode como uXXXX (hasta 4 hexadecimales) o como UXXXXXX (hasta 6 hexadecimales) ● En GNU/Linux se escribe con Ctrl+Shift+u+codepoint ENTER. Cuando esto se hace la letra u aparece subrayada. Se debe tener una fuente apropiada instalada. ● En MS Windows: ver la utilidad "charmap". Se debe tener una fuente apropiada instalada.
  • 23. 23 Unicode (no funciona en Windows) Nota: estos caracteres especiales requiren más de un byte para su almacenamiento
  • 24. 24 Funciones básicas de entrada desde el teclado (stdin) ● Sin formato: – getchar() lee un carácter desde stdin – gets() lee una cadena de caracteres desde stdin (C99 – desaconseja su uso, C11 – obsoleto) – gets_s() lee una cadena de caracteres desde stdin (es el reemplazo de gets()) ● Con formato: – scanf() lee una cadena de caracteres con formato desde stdin
  • 25. 25 int scanf(const char* formato, ...); ● Lee datos del teclado (stdin) y lo almacena de acuerdo al formato dado, en las direcciones de memoria indicadas. ● De forma a similar a printf() puede leer un número variable de entradas; en este caso se supone que cada entrada está separada por un espacio en blanco ● Ignora los espacios en blanco ● Retorna el número de items de la cadena de argumentos exitosamente leídos o un EOF (constante igual a -1) si un error ocurre.
  • 26. 26 int scanf(const char* formato, ...); ● El formato está dado por: %[*][ancho][longitud]especificador ● Ver detalles en: http://en.cppreference.com/w/cpp/io/c/fscanf
  • 28. 28 %[*][width][length]specifier (asteriscos porque la función scanf() espera punteros como argumentos)
  • 30. 30 |
  • 31. 31 int getchar(void); Lee un caracter desde el teclado (mostrándolo). A pesar de todo estoy leyendo en un char
  • 32. 32 char* gets (char* str); ● El C99 no recomienda usar este comando. El C11 lo vuelve obsoleto. La razón de esto es que este comando hace vulnerable el programa al ataque por hackers. Ver detalles en: – http://en.cppreference.com/w/c/io/gets – http://en.wikipedia.org/wiki/Buffer_overflow – http://c-faq.com/stdio/getsvsfgets.html
  • 33. 33 char* gets (char* str); Buffer overflow!! Dirección char hex 0xbfd8935b 1 E 45 0xbfd8935c 2 j 6A 0xbfd8935d 3 e 65 0xbfd8935e 4 m 6D 0xbfd8935f 5 p 70 0xbfd89360 6 l 6C 0xbfd89361 7 o 6F 0xbfd89362 8 s 73 0xbfd89363 9 0 00 7565164 = 0x00736F6C m.buf m.i Codificación Little-endian del número entero m.i
  • 34. 34 char* gets_s(char *str, rsize_t n); ● Función sugerida en el C11, en reemplazo de gets() ● Lee a lo más n-1 caracteres de stdin en la cadena apuntada por str. Automáticamente agrega el 0 al final de la cadena ● No está implementada todavía en el gcc v.4.6, porque este aún no incorpora los cambios sugeridos en el C11
  • 35. 35 Otro reemplazo de gets(): fgets() strchr() busca desde la dirección buf hasta que encuentra la primera aparición de un n. Se retorna dicha dirección de memoria
  • 36. 36 ¿Por qué este código aparentemente correcto no funciona? Se presionó 20 (ENTER) y nada más. El programa no me preguntó el nombre y terminó
  • 37. 37 Aquí el primer printf() pregunta la edad. Se escribe "20" y se presiona ENTER. El buffer del teclado contiene: 2 0 n El scanf() lee el %d, es decir el 20 y lo guarda en la variable edad; sin embargo deja el 'n' en el buffer del teclado; ahora entra el fgets() lee el 'n' y no alcanza a leer el nombre. El problema es que scanf() dejó basura en el buffer del teclado (concretamente el n). Según http://c-faq.com/stdio/gets_flush2.html la solución es vaciar el buffer del teclado lo cual se puede hacer con alguno de los siguientes comandos: ● while((c = getchar()) != 'n' && c != EOF); //un ciclo vacío ● __fpurge(stdin); //solo funciona con gcc/Linux (stdio_ext.h) ● flushinp(); // si está manejando la librería curses.h
  • 38. 38
  • 39. 39 Nota con respecto a la entrada de datos desde el teclado scanf() no es muy versátil que digamos y tiene problemas como el anteriormente mostrado. La mejor opción que se tiene si se requiere seguridad procesando la entrada es utilizar fgets(), sscanf() y/o alguna librería de regular expressions: http://en.wikipedia.org/wiki/Regular_expression No existen librerías de expresiones regulares en el estándar de C, pero si algunas para ciertos sistemas como regex.h o PCRE para UNIX/Linux: http://www.lemoda.net/c/unix-regex/index.html http://www.pcre.org/ Se podría también utilizar una interface con el comando de consola grep.
  • 40. 40
  • 41. 41 Tomado de: http://xkcd.com/208/ NOTA: lenguajes como PERL, PYTHON, MATLAB tienen un muy buen soporte para expresiones regulares. Les aconsejo sinceramente aprender a manejar las expresiones regulares cuando tengan problemas con validar entradas de texto, o procesar una gran cantidad de datos en archivos. Es una herramienta que los puede sacar de apuros en más de una ocasión.
  • 42. 42 Preferiblemente no use scanf() http://c-faq.com/stdio/scanfprobs.html Una buena interface debe permitir la posibilidad que el usuario entre errores: por ejemplo letras en un campo donde se piden números, más o menos caracteres que los esperados, etc. scanf() no es capaz de tratar este tipo de situaciones. Por lo tanto, se sugiere mejor utilizar fgets() y luego interpretar lo leído utilizando sscanf() y/o algunas otras técnicas como expresiones regulares. Funciones como strtol(), strtok(), y atoi() son bastante útiles.
  • 43. 43 La librería inttypes.h Cuando se quieren imprimir (printf())o leer (scanf()) el tipo de números definidos en stdint.h, se deben ajustar las cadenas de texto con los formatos, para que funcionen con estos tipos de datos. inttypes.h se encarga de esto. Tenga en cuenta que la librería inttypes.h llama automáticamente a stdint.h
  • 44. 44 Los símbolos de printf() y scanf() definidos por inttypes.h El N en cursiva es 8, 16, 32 o 64 bits
  • 45. 45 Ejemplo con inttypes.h Desde este punto de vista PRIx8 es un formato que se le agrega a printf() para que este muestre hexadecimales de 8 bits. Observe que se utilizó implícitamente la concatenación de cadenas.
  • 46. 46 Funciones de salida/entrada de datos básicas <curses.h> ● curses.h es una biblioteca que provee rutinas de entrada/salida avanzadas y que permite al programador escribir interfaces basadas en texto. ● Fue creada por Ken Arnold para el sistema UNIX BSD. Sin embargo, existen implementaciones para Linux (ncurses.h) y para Windows (pdcurses.h). ● Permite manejar detalladamente la pantalla, manejar el mouse, crear interfaces de texto amigables.
  • 48. 48
  • 49. 49 Instalación en Windows de pdcurses ● Descargue de: http://pdcurses.sourceforge.net/ ● Lea las instrucciones de instalación. ● O si está utilizando el MinGW, simplemente en la línea de comandos escriba: mingw-get install mingw32-libpdcurses mingw32-pdcurses
  • 50. 50 Configuración del PDCURSES en Codeblocks para Windows
  • 51. 51 Configuración del PDCURSES en Codeblocks para Windows
  • 52. 52 Configuración del PDCURSES en Codeblocks para Windows
  • 53. 53 Configuración del PDCURSES en Codeblocks para Windows
  • 54. 54 Configuración del PDCURSES en Codeblocks para Windows Si le aparece este error copie el archivo libpdcurses.dll en la misma carpeta donde está el archivo .exe de su proyecto.
  • 55. 55 En Linux ● Instale la librería libncurses5-dev o similar, ej.: $ sudo apt-get install libncurses5-dev ● Verifique que los siguientes archivos existan: ● ● ● ● ● Observe que en este caso ncurses.h y curses.h son el mismo archivo
  • 56. 56 Tutorial de ncurses.h ● Se sugiere mirar el siguiente tutorial: http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/ ● Los siguientes programas están basados en dicho tutorial.
  • 57. 57 Un primer ejemplo Si no se pone este comando, la consola se comportará de modo extraño. En linux esto se arregla con el comando de consola reset. De todos modos se debe poner siempre endwin(). ncurses.h en linux curses.h en windows -lncurses en linux -lpdcurses en windows
  • 58. 58 sin tener que dar ENTER
  • 59. 59
  • 63. 63 Uso del mouse con ncurses.h Ver el código: http://programaciondecomputadoresunalmzl.wikispaces.com/file/detail/03_mouse_curses.c
  • 64. 64 Otros comandos de curses.h ● int addch(const chtype letra_char); ● int mvaddch(int y, int x, const chtype letra_char); ● int move(int y, int x); ● chtype inch(void); ● int mvprintw(int y, int x, char *format, ...); ● int getstr(char* string);
  • 65. 65 Programación de juegos Existen varias librerías especialmente diseñadas para programar juegos. Estas librerías contienen funciones para el manejo de gráficos 2D y 3D, sonidos, joystick, etc. Algunas de las más populares son: Allegro: http://alleg.sourceforge.net/ ClanLib: http://clanlib.org/wiki/Main_Page OpenGL: http://www.opengl.org/ SDL: http://www.libsdl.org/ SFML: http://www.sfml-dev.org/
  • 66. Material basado en: ● http://www.slideshare.net/amraldo/introduction-to-c-programming-7898353 ● http://www.slideshare.net/petdance/just-enough-c-for-open-source-program ● http://www.cplusplus.com/reference/cstdio/printf/ ● http://www.cplusplus.com/reference/cstdio/scanf/ ● http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1049157810&id ● http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/ ● Wikipedia