¿Por qué getchar () no espera que presione enter luego de scanf ()?

Estoy aprendiendo C y estoy usando “getchar ()” para detener las ventanas de comandos para que pueda ver los ejercicios que estoy haciendo, pero simplemente no funciona. aquí hay una muestra:

#include  int main() { int value; printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); scanf("%d", &value); switch (value) { case 1: printf("you selected the option 1."); break; case 2: printf("you selected the option 2."); break; case 3: printf("you selected the option 3."); break; case 4: printf("goodbye"); break; default: printf("thats not an option"); break; } getchar(); return 0; } 

este es el resultado:

  1. Opción 1.
  2. opcion 2.
  3. opción 3.
  4. Salida.

Haz una opción: 1

seleccionaste la opción 1.

Proceso devuelto 0 (0x0) tiempo de ejecución: 3.453 s

Pulse cualquier tecla para continuar.

¿Por qué no espera la entrada de “getchar ()”?

Su scanf solo comió el número pero no la línea nueva final. Poner una línea nueva o un espacio en blanco después del% d le dará el problema opuesto, leyendo demasiado lejos.

Esta es la razón por la cual a las personas no les gusta scanf.

Sugeriría leer una línea real (use fgets(3) ) y luego use sscanf() para escanear la cadena.

En primer lugar, no use fflush () para borrar un flujo de entrada; el comportamiento no está definido:

7.19.5.2.2 Si la ruta apunta a una secuencia de salida o una secuencia de actualización en la que no se ingresó la operación más reciente, la función fflush hace que todos los datos no escritos para esa transmisión se entreguen al entorno de host para escribirse en el archivo; de lo contrario, el comportamiento no está definido.

El problema es que la nueva línea final no está siendo consumida por el especificador de conversión “% d”, por lo que el getchar() la está getchar() inmediatamente. No hay una mejor manera de lidiar con esto, pero generalmente el enfoque es leer toda la línea como texto (usando fgets() o scanf() con un especificador de conversión de tamaño “% s”), que consumirá la nueva línea, luego convertir al tipo de datos de destino utilizando sscanf() o strtol() o strtod() .

¿Puede getchar obtener su retorno de carro que ingrese después del 1?

El getchar () está leyendo \ n desde el teclado en scanf – mira aquí para más información

usted está obteniendo un retorno de carro, de la forma en que lo solucionaría, definir un char y simplemente hacer que escanee el retorno del carro,

char ch; (antes de su getch () ingrese lo siguiente) scanf("%c",&ch); getchar(); scanf("%c",&ch); getchar();

debería funcionar de esta manera, no es la manera más eficiente de hacerlo, pero funciona para mí.

Como se mencionó anteriormente, scanf deja \ n atrás después de leer la entrada del usuario.

Soultion: agrega getchar () directamente después de scanf.

Eso compensa la deficiencia de scanf.

es decir

 int value; printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); scanf("%d", &value); getchar(); switch (value) 

Creo que ingresaste una entrada luego de ingresar “1”. Será aceptado por el getchar() .Para que pueda resolver el problema simplemente agregue un getchar() adicional después del original (justo antes del return 0; ).

** Probé esto y funcionó.

 #include  #include void main() { int value; printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); scanf("%d", &value); switch (value) { case 1: printf("you selected the option 1."); break; case 2: printf("you selected the option 2."); break; case 3: printf("you selected the option 3."); break; case 4: printf("goodbye"); break; default: printf("thats not an option"); break; } getch(); } 

Para que su progtwig funcione, debe “vaciar” su flujo de entrada antes de llamar a getchar () con una llamada a fflush (stdin). Lo que hace es que, cuando teclea un número en el teclado y luego la tecla de retorno, el búfer de entrada obtiene ambos caracteres, por ejemplo ‘1’ y ‘\ n’, y su llamada a scanf solo obtiene ‘1’ para que ‘ \ n ‘permanece en el búfer de entrada. Cuando llamas a getchar, estás “obteniendo” el rest ‘\ n’. Vaciar la entrada descarta todo el buffer.