Buffer i saltos de linea en C

Iniciado por proterva, 16 Agosto 2018, 12:32 PM

0 Miembros y 1 Visitante están viendo este tema.

proterva

Soy novato y no entiendo cuanto un salto de linea se ejecuta y cuando este es guardado como caracter y no se ejecuta.

#include <stdio.h>

main()
{   // programa sin limpiar buffer   
   float precio=0; char car=0;
   printf("precio  ");
   scanf("%g",&precio);
   //ahora al apretar    intro me queda
   //dentro del buffer un salto de linea (\n) y
   //al mismo tiempo se ejecuta un salto de linea   
   printf("pulse entrar para continuar ");
   scanf("%c",&car);
   //ahora al volver apretar intro me queda
   //dentro del buffer dos saltos de linea(\n\n)
   //el segundo salto de linea introducido
   //es leido como un caracter y no es ejecutado
   printf("precio=%g,\n",precio);
   //ahora en el buffer nos queda un salto de linea(\n)
   
   //resultado:
   //precio: (entrar 10 + pulsar intro)
   //pulse entrar para continuar (pulsar intro) precio=10
   
   //////////////////////////////////////////////////////////////
   //programa limpiando buffer
   
   float precio=0; char car=0;
   printf("precio  ");
   scanf("%g",&precio);
   //ahora al apretar    intro me queda
   //dentro del buffer un salto de linea (\n) y
   //al mismo tiempo se ejecuta un salto de linea
   fflush( stdin);
   //ahora el buffer esta vacio
   
   printf("pulse entrar para continuar ");
   scanf("%c",&car);
   //ahora al volver apretar intro me queda
   //dentro del buffer hay un salto de linea(\n)
   //Y este salto de linea deberia ser leido como un
   //caracter y no ser ejecutado
   //en cambio, no se por que si es ejecutado
   //lo que quiere decir que no es leido como caracter.
   //lo que significa que en el buffer nos queda un (\n)
   //Porque??????????????????????????   
   printf("precio=%g,\n",precio);
   
   //resultado
   
   //precio: (entrar 10 + pulsar intro)
   //pulse entrar para continuar (pulsar intro)
   //precio=10
   
}

MAFUS

#1
No te acostumbres a usar fflush(stdin), n ofunciona en todos los compiladores.

En tu primer ejemplo scanf captura solo los números pero se detiene antes del \n.
En el buffer que da \n.
Cuando capturas con scanf el carácter se encuentra con \n y lo saca del buffer, pero como no lo muestras no se ve el salto de línea. scanf ha hecho su trabajo, ha sacado un carácter el buffer así que retorna con éxito, y el programa continua mostrando con el printf.

En tu segundo ejemplo scanf captura solo los números pero se detiene antes del \n.
En el buffer que da \n.
Con fflush(stdin) vacías el buffer de entrada, así que al ejecutar de nuevo scanf para capturar un carácter, éste detendrá el programa para que el usuario llene el buffer.