Tutorial de Lenguaje C                                                                                                   Dr. Roberto Gómez


prog02.c Ejemplo captura de datos

 /*  Programa de ejemplo de captura de un entero corto, un entero y un flotante  */

#include <stdio.h>

int main( )
{
      short  s;
      int  l;
      float  f;

      printf("Introduzca un entero corto, un entero y un flotante separados por un espacio: \n")
      scanf("%hd %d %f",&s,&l,&f);

}

/* Después de haber introducido -123 999 y 99.0044 <RET> las variables s,l, y f tienen los valores -123 999 y 99.0044 */
 

Ejercicios captura de datos

  1. Del programa anterior borre todos los caracteres "&" de la función scanf( ) y vea que sucede.
  2. El programa anterior no despliega lo captura, modifique el programa de tal forma que despliegue lo capturado.
  3. Cambie la línea scanf("%hd %d %f",&s,&l,&f); por  scanf("%hd,%d,%f",&s,&l,&f); y vea lo que sucede


Nota sobre el uso de scanf( ) para leer un caracter (%d)

    El leer un caracter con la función scanf( ) en sistemas Unix/Linux no es simple. Cuando uno usa esta función para leer un carácter generalmente el comando se comporta de forma extraña. En la mayor parte de los casos el programa hace caso omiso de la captura y "se la salta".
    Consideremos el siguiente ejemplo

    #include <stdio.h>

    int main( )
    {
       float x;
       char r;
       int n;

             printf("De el valor de n: ");
             scanf("%d", &n);
             printf("De un caracter: ");
             scanf("%c", &r);
             printf("De un numero real x: ");
             scanf("%f", &x);


             printf("El valor de n es %d y el de x es: %f \n",n,x);
             printf("El caracter proporcionado es: %c \n",r )
    }

    La salida de la ejecución es la siguiente

    $ gcc t2.c -o t2
    $ ./t2
    De el valor de n: 89
    De un caracter:  De un numero real x: 9.2
    El valor de n es 89 y el de x es: 9.200000
    El caracter proporcionado es:

    $

    En el ejemplo anterior el program "se salto" la captura del caracter.

    Uno de los problemas que se tiene es que scanf( ) lee el caracter de retorno de la captura anterior y no toma en cuenta lo que se le indica. Una buena referencia a este tipo de problema se encuentra aqui. Es posible utilizar funciones como getc( ) o getchar( ) ( ver aquí ) , sin embargo tambien es posible utilizar scanf( ). Para esto debemos indicarle a scanf( ) que "se coma" el caracter de retorno anterior. La forma de hacerlo es usando la constante %*c antes de la captura del caracter:  scanf("%*c %c",&variable_char).

    El usar lo anterior en  el programa anterior (ver línea azul), nos arroja el siguiente código:

            #include <stdio.h>

            int main( )
            {
                float x;
                char r;
                int n;

                 printf("De el valor de n: ");
                 scanf("%d", &n);
                 printf("De un caracter: ");
                 scanf("%*c %c", &r);
                 printf("De un numero real x: ");
                 scanf("%f", &x);


                 printf("El valor de n es %d y el de x es: %f \n",n,x);
                 printf("El caracter proporcionado es: %c \n",r );
           }


    La salida de la ejecución es:

            $ gcc t2.c -o t2
            $ ./t2
            De el valor de n: 89
            De un caracter:  r
            De un numero real x:  9.2
            El valor de n es 89 y el de x es:  9.200000
            El caracter proporcionado es: r
            $

    Cabe la pena aclarar que si la función scanf( ) es utilizada para leer un caracter, y es la única utilizada, no es necesario hacer lo anterior. Esto traera problemas ya que habria que capturar un retorno (enter) antas de capturar el caracter. En estos casos se recomienda usar solo la funcion scanf( ).
    La solución a lo anterior se obtuvo de aquí.

MENÚ PRINCIPAL