Username:
Password:
C Programming (Español) Tutorials

Programa Básico del C / Función "scanf"

Subtitles of the Movie

En este modulo veremos la funcion "scanf". Esta es una funcion de la biblioteca de funciones estandar del CÉ similar a "printf". Esta lee la informacion del teclado mientras que "printf" la despliega. Aqui tenemos de nuevo el programa "Hello World" que he guardado como "hello3.c". Vamos a mejorar este programa al agregar la funcion "scanf" para leer una edad desde el teclado. Preguntaremos la edad al usuario del programa, este la ingresara y luego la desplegaremos. Vamos a almacenar la edad en la variable "age" como hicimos anteriormente. Creamos una nueva variable "age" de esta manera, conservamos las palabras "Hello World" y vamos a leer la edad del usuario. Podriamos utilizar la funcion "scanf" en este punto y el programa se detendria esperando la entrada del teclado, pero el usuario no sabra que informacion debe ingresar porque solo se despliega "Hello World". Si el programa se detiene de repente el usuario no sabra que debe ingresar su edad. Para que el programa sea mas comprensible, agregamos otra funcion "printf" igual a la primera. para desplegar la frase "Please enter your age". Incluimos un punto y coma y un espacio para terminar la cadena literal. Este es el final de la funcion "printf" con un punto y coma de manera muy similar a la funcion "printf" anterior. Esta despliega estas palabras, pero no tenemos una barra diagonal invertida seguida por la letra "n"É porque no queremos que el cursor permanezca intermitente en la siguiente lineaÉ sino despues del espacio en blanco a continuacion del punto y coma. La creacion de una nueva linea no es obligatoria en la funcion "printf" y podemos utilizarla cuando sea necesario. Ya que el usuario conoce los datos que debe ingresar, utilizamos la funcion "scanf" para leer la informacion del teclado. De nuevo utilizamos la cadena literal, y como en el ejercicio anterior, ingresamosÉ un signo de porcentaje y la letra "d", almacenando la edad en la variable "age". Esta linea aun no es correcta. Antes de ver el error, vamos a compararla con la que utilizamos para la funcion "printf" anterior. Escribimos la frase "My age is" seguida por un signo de porcentaje, la letra "d", una coma y la variable "age". Esta funciono y es casi igual, pues tenemos el signo de porcentaje, la letra "d", una coma y la variable "age". Sin embargo, esta sentencia no es completamente correcta. por una razon complicada relacionada con los apuntadores, el direccionamiento de memoria, etcÉ y no veremos estos temas por ahora. Vamos a solucionar este problema agregando un signo ampersand antes de la variable "age". La razon de este proceso es complicada, asi que le pido un poco de paciencia. No me agrada pedirle que memorice aspectos, pero solo recuerde que al utilizar la funcion "scanf". debemos ingresar un ampersand antes del nombre de la variable y no en la funcion "printf". En un proximo capitulo. explicare este aspecto con detalle, pero por ahora simplemente memoricelo. Teoricamente, hemos ubicado el valor dentro de la variable "age", asi que veamos si el programa funciona. Creamos otra sentencia "printf" para verificar si la edad es correcta asi: ingresamos "printf, the age you entered is", un signo de porcentaje y la letra "d", una barra diagonal invertida, la letra "n", una coma y la variable "age". No tenemos un ampersand porque solo lo utilizamos con la funcion "scanf". Al utilizar estas funciones, solo empleamos el signo ampersand con "scanf". El signo ampersand se utiliza a menudo y aprenderemos acerca de el al ver los apuntadores. El programa funciona, asi que vamos a ejecutarlo. Primero lo compilamos, no obtenemos ningun error y lo ejecutamos. Aparece la frase "Please enter your age", ingresamos el valor 36, pulsamos la tecla "Enter" y algo salio mal. El programa ha desaparecido. No espero que usted conozca la razon de este comportamiento porque esta no es obvia. De hecho, es muy peculiar y tiene que ver con la interaccion entre las funciones "scanf" y "getchar". Estas no funcionan bien en el mismo programa. Recuerde que "getchar" crea una pausa antes de que el programa desaparezca. y solo espera que se pulse "Enter"; al hacerlo el programa finaliza y la ventana desaparece. Veamos lo que ha ocurrido. Realizamos un llamado a la funcion "scanf" y esta lee un numero a partir del teclado, es decir, el programa se detiene para ingresar el valor. Escribimos 36 y pulsamos "Enter". La funcion "scanf" lee el valor 36 y lo ubica en la variable "age". El signo de porcentaje y la letra "n" significan que estamos leyendo un numero sin incluir el caracter de nueva linea. El problema es que no estamos leyendo el caracter de nueva linea, asi que el programa llega a la funcion "printf", despliega el valor 36 ingresado. y continua con la funcion "getchar" cuyo unico proposito es leer un caracter. Esta lee el caracter de nueva linea que no fue leido por la funcion "scanf". Ingresamos dicho caracter despues del valor 36. pero este no es leido por la funcion "scanf" sino por la funcion "getchar". ÀCual es la solucion? Podriamos incluir otra funcion "getchar" pero existe otra solucion estandar: aqui ingresamos la funcion "fflush" con "stdin" entre parentesis, cuyo propositoÉ es descartar cualquier caracter ingresado por el teclado que no haya sido leido por el programa, es decir, eliminar el caracter de nueva linea e ignorarlo por completo. Al llamar a continuacion a la funcion "getchar", no habran mas caracteres esperando ser leidos. Esta solucion no es muy elegante. El problema es que las funciones "getchar" y "scanf" no funcionan bien en conjunto, y aunque esta solucion no es muy apropiada, funcionara por ahora. Aun nos queda otro problema que no es muy obvio: el programa no se va a compilar de esta manera. Obtenemos 4 errores; el mensaje "stdin undeclared" indica que no se reconoce el item "stdin". Esto era de esperarse, asi que hacemos que el programa lo reconozca. de esta manera. Incluimos un signo de numeral seguido por el texto "include stdio.h". Puede parecer complicado que debido a una incompatibilidad de las funciones "getchar" y "scanf". tuvimos que agregar las funciones "fflush" con "stdin" y la linea "#include stdio.h". Esto puede salirse de control. A medida que avancemos en el curso veremos que los comandos "#include" son muy comunes. De hecho, he debido incluir uno de ellos desde el programa "Hello World". Aqui deberiamos incluir una sentencia "#include stdio.h", pero decidi no incluirlaÉ para no crear confusion al tener que explicar este aspecto. No veremos este tema por ahora, pero veremos los comandos "#include" mas adelante. Por ahora escribimos "#include stdio.h" en la parte superior del programa. Al utilizar las funciones "printf", "scanf", "fflush", "getchar" o incluso el item "stdin" debemos incluir el archivo "stdio.h" aqui. Aunque no es obligatorio, en ocasiones es necesario incluir esta sentencia. En este caso declaramos el elemento "stdin" porque no podriamos continuar si no lo hacemos. Utilizamos el archivo "stdio.h" porque este contiene varios prototipos, los cuales veremos en un proximo capitulo. Por ahora recuerde que casi siempre es necesario incluir el archivo "stdio.h" en los programas del C, en especial al utilizar las funciones "printf" y "scanf". Teoricamente este programa esta completo ahora. Vamos a compilarlo para verificarlo. No obtenemos errores, lo ejecutamos y aparece la frase "Hello World, Please enter your age". Veamos si el programa funciona. Ingresamos 36 y obtenemos la frase "The age that you entered was 36". El programa espera que pulsemos otra tecla, asi que al hacerlo. la ventana desaparece. Todo funciona correctamente.

Tutorial Information

Course: C Programming (Español)
Author: Mark Virtue
SKU: 33759
ISBN: 1-933736-81-X
Release Date: 2007-04-16
Duration: 21.5 hrs / 139 lessons
Captions: Available on CD and Online University
Compatibility: Vista/XP/2000, OS X, Linux
QuickTime 7, Flash 8

VTC Sign up & Benefits

  • Unlimited Access
  • 81,350 Video Tutorials (20,800 free)
  • Video Available as Flash or QuickTime
  • Over 782 Courses
  • $30 for One Month Access
  • Multi-User Discounts Available