scanf() deja el carácter de nueva línea en el búfer

4 minutos de lectura

avatar de usuario
ipkiss

tengo el siguiente programa:

int main(int argc, char *argv[])
{
  int a, b;
  char c1, c2;
  printf("Enter something: ");
  scanf("%d",&a); // line 1
  printf("Enter other something: ");
  scanf("%d", &b); // line 2

  printf("Enter a char: ");
  scanf("%c",&c1); // line 3
  printf("Enter another char: ");
  scanf("%c", &c2); // line 4

  printf("Done"); // line 5

  system("PAUSE");

  return 0;
}

Como leí en el libro C, el autor dice que scanf() dejó un carácter de nueva línea en el búfer, por lo tanto, el programa no se detiene en la línea 4 para que el usuario ingrese los datos, sino que almacena el carácter de nueva línea en c2 y pasa a la línea 5.

¿Está bien?

Sin embargo, ¿esto sólo ocurre con char ¿tipos de datos? Porque no vi este problema con int tipos de datos como en la línea 1, 2, 3. ¿Es correcto?

  • A veces se sugiere que fflush(stdin) se puede utilizar antes de la llamada a scanf() para un solo personaje. Por favor, lea Uso fflush(stdin) para una discusión de los pros y los contras y las alternativas a ese método (que funciona, más o menos, en Windows y no funciona en la mayoría de los otros lugares).

    –Jonathan Leffler

    2 de diciembre de 2018 a las 3:09

  • ¿Podría indicarnos a qué libro se refiere?

    -surya kiran

    31 de marzo de 2020 a las 22:17

avatar de usuario
Shweta

Usar scanf(" %c", &c2);. Esto resolverá tu problema.

  • fgets()/getline() y luego sscanf() o strtol()etc., también tiene otra gran ventaja sobre el uso scanf() directamente. Cuando el programa encuentra una entrada inesperada, el flujo de entrada no se deja en un estado desconocido donde la recuperación sin perder datos puede ser imposible.

    –Andrew Henle

    18 de febrero de 2021 a las 16:45

Otra opción (que obtuve de aquí) es leer y descartar la nueva línea usando el opción de supresión de asignación. Para hacer eso, simplemente ponemos un formato para leer un carácter con un asterisco entre % y c:

scanf("%d%*c",&a); // line 1
scanf("%c%*c",&c1); // line 3

scanf luego leerá el siguiente carácter (es decir, la nueva línea) pero no lo asignará a ningún puntero.

Al final, sin embargo, apoyaría la última opción de las preguntas frecuentes:

O, según sus requisitos, también puede olvidarse de scanf()/getchar(), usar fgets() para obtener una línea de texto del usuario y analizarla usted mismo.

  • El problema con esta técnica es que si el usuario escribe a luego espacio, luego nueva línea, la conversión de caracteres suprimida lee el espacio y aún deja la nueva línea. Si el usuario escribe supercalifragilisticexpialidocious cuando esperas a, tienes muchos personajes adicionales con los que lidiar. Nunca se puede saber si una conversión suprimida final tiene éxito, ya que no se cuentan en el retorno de scanf().

    –Jonathan Leffler

    12 de enero de 2020 a las 15:53

  • Esto solo descarta uno personaje. Colocando un espacio antes % descartará cualquier cantidad de espacio en blanco inicial (incluido ninguno).

    – Veleta

    25 de enero a las 7:58

avatar de usuario
Ji-won

Usar getchar() antes de llamar segundo scanf().

scanf("%c", &c1);
getchar();  // <== remove newline
scanf("%c", &c2);

  • El problema con esta técnica es que si el usuario escribe a luego espacio, luego nueva línea, la conversión de caracteres suprimida lee el espacio y aún deja la nueva línea. Si el usuario escribe supercalifragilisticexpialidocious cuando esperas a, tienes muchos personajes adicionales con los que lidiar. Nunca se puede saber si una conversión suprimida final tiene éxito, ya que no se cuentan en el retorno de scanf().

    –Jonathan Leffler

    12 de enero de 2020 a las 15:53

  • Esto solo descarta uno personaje. Colocando un espacio antes % descartará cualquier cantidad de espacio en blanco inicial (incluido ninguno).

    – Veleta

    25 de enero a las 7:58

avatar de usuario
rai singh

/*Take char input using scanf after int input using scanf just use fflush(stdin) function  after int input */
#include<stdio.h>
#include<conio.h>
void main()
{
  int x;
  char y;
  clrscr();
  printf(" enter an int ");
  scanf("%d",&x);
  fflush(stdin);
  printf("\n Now enter a char");
  scanf("%c",&y);
  printf("\n X=%d and Y=%c",x,y);
  getch();
}

  • Tenga en cuenta las advertencias sobre el uso fflush(stdin).

    –Jonathan Leffler

    el dia de ayer

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad