¿Por qué mi profesor está usando dos getchar () ;?

¿Por qué mi prof usa dos getchar (); Al final de nuestros tutoriales del progtwig C?

¿Y cuál es la “mejor manera” para esto?

La mejor manera es no agregar ningún código para intentar mantener abierta la ventana de la consola: inicie su progtwig directamente desde la ventana de la consola.

Si debe iniciar su progtwig desde el IDE y desea que el progtwig no finalice antes de que el usuario presione Intro, un solo getchar() debe hacerlo.

La segunda mejor manera de hacer que el progtwig finalice después de que el usuario presione una tecla, es asegurarse siempre de que no haya entradas pendientes y usar un solo getchar() .

La razón por la que su profesor usa 2 getchar() , supongo, es que ya hay un carácter en el búfer de entrada de las entradas anteriores. Para consumir todos los caracteres de las entradas, hasta e incluyendo el ENTER, esto es lo habitual:

 int ch; /* ... */ printf("Press Enter"); fflush(stdout); while ((ch = getchar()) != '\n' && ch != EOF) /* void */; 

Está esperando la entrada del usuario para que pueda ver la salida del progtwig, de lo contrario, se completará y la salida no será visible (según el sistema operativo). Sácalo y pruébalo.

Quiere que la consola permanezca abierta y espere a que el usuario presione una tecla. Creo que para recordar eso, dependiendo de lo que suceda en el progtwig de sus profesores sobre el “getchar ()”. Puede que todavía haya algo en el búfer, por lo que agregó un segundo “getchar ()”. No es exactamente la forma más elegante de resolver el problema.

Edición: Aquí hay un pequeño ejemplo. Todavía hay un “\ n” restante en el búfer de “scanf ()” Si agrega un segundo “getchar ()”, obtendrá el resultado esperado. Tienes que vaciar el búfer antes de la “getchar ()”.

 #include  main() { int input; scanf("%d", &input); printf("The input is %d\n", input); getchar(); return 0; } 

Edición 2: Aquí hay una solución tomada desde aquí .

 int c; printf( "Press ENTER to continue... " ); fflush( stdout ); do c = getchar(); while ((c != '\n') && (c != EOF)); 

La razón por la que muchos principiantes sienten que es necesario poner dos llamadas getch en su código es que una sola llamada a menudo no funciona.

La razón de esto es que getch busca la siguiente entrada de teclado de la cola de entrada. Desafortunadamente, esta cola se llena cada vez que el usuario presiona las teclas del teclado, incluso si la aplicación no está esperando la entrada en ese momento (o si no está leyendo toda la entrada; consulte la respuesta de Lulu para ver un ejemplo). Como consecuencia, getch buscará un carácter de la cola de entrada sin esperar la próxima pulsación de tecla, que es realmente lo que quiere el progtwigdor.

Por supuesto, esta “solución” todavía fallará en muchos casos, cuando hay más de un solo carácter en la cola del teclado. Una mejor solución es vaciar esa cola y luego solicitar el siguiente carácter. Desafortunadamente, no hay una forma independiente de la plataforma para hacer esto en C / C ++, que yo sepa. La forma convencional de hacer esto en C ++ (lo siento, mi C es limitada) se ve así:

 std::cin.ignore(std::cin.rdbuf()->in_avail()); 

Esto simplemente ignora todas las entradas disponibles, eliminando efectivamente la cola de entrada. Desafortunadamente, este código tampoco siempre funciona (por razones muy extrañas).

¿Por qué mi prof usa dos getchar (); Al final de nuestros tutoriales del progtwig C?

Asumiendo que tienes algo como

 int main ( void ) { int input; scanf ( "%d", &input ); printf ( "The input is %d.\n", input ); getchar(); getchar(); return 0; } 

Dos porque scanf no regresará hasta que se presione una entrada, pero habrá un ‘\ n’ en la entrada y cualquier otro carácter que haya ingresado en el búfer de entrada.

Por lo tanto, si ejecuta lo anterior e ingresa 1234 Enter , el progtwig se pausará después de imprimir. The input is 1234. hasta que vuelva a presionar Enter . El primer getchar lee el '\n' asociado con el primer Enter . Si ingresa algo más, como 1234 Ingresar Espacio , el progtwig no se pausará, ya que primero getchar leerá el espacio. Dos getchar s podrían no ser suficientes, y ha intercalado el código para imprimir la respuesta en el código para manejar la entrada.

¿Y cuál es la “mejor manera” para esto?

Hay varias formas estándar de leer la entrada en C. También hay formas específicas de la plataforma de ignorar el texto en el búfer de entrada, pero no debería hacer eso si usa fgets para leer una línea de entrada en lugar de scanf para leer algo. Entrada desde la última línea introducida.

fgets (lea la entrada hasta que ‘\ n’ o el final del archivo) seguido de sscanf (analice una cadena para la entrada) esté a salvo de la saturación del búfer, y absorberá cualquier entrada adicional y la terminación de línea ‘\ n’:

 #include  int main ( void ) { int input; char buf[16] = ""; fgets ( buf, sizeof buf, stdin ); sscanf ( buf, "%d", &input ); printf ( "The input is %d.\n", input ); fflush ( stdout ); getchar(); return 0; } 

No es necesario descargar la salida stdout después de que printf no sea necesario para el terminal IO, pero puede serlo si lo está colocando en un disco (por lo general, cuando está registrando un progtwig que falla, perderá el bit más interesante justo antes del fallo si no lo hace). no enrasar).

Debido a que fgets lee hasta el final de la línea incluido, no quedan caracteres en el búfer, por lo que solo necesita un getchar , y una entrada un poco incómoda como 1234 Space Enter no hace que el progtwig finalice sin pausa.

Sin embargo, la mayoría de las veces no necesita esperar después de ejecutar una aplicación de consola: en Linux u otros sistemas Unix, normalmente tiene una consola abierta y ejecuta el progtwig allí, después de lo cual el control regresa al shell. En Windows, los IDE como Visual Studio normalmente ejecutan el progtwig y lo pausan usando algo como:

  "C:\WINDOWS\system32\cmd.exe" /c ""...\ConsoleApplication1.exe" & pause" 

O puede abrir cmd.exe y ejecutarlo desde allí, o puede ejecutarlo con un acceso directo .pif y establecer la checkbox para que no cierre la consola al salir, o puede crear un archivo de proceso por lotes que lo ejecute y haga una pausa.

Realmente solo necesita hacer que el progtwig se detenga solo si está en Windows y está usando un depurador para ejecutarlo y no ha establecido ningún punto de interrupción.

para pausar el (probablemente) progtwig de línea de comandos. está usando dos, porque usar solo uno no funcionó y probablemente no sabe por qué …

Encuéntrale una solución mejor para hacer esto (y no std :: cin) y serás el héroe del día.

Probablemente para mantener abierta la ventana de salida cuando ejecute el progtwig desde el IDE.

… por qué hay dos que están más allá de mí sin embargo.

Es una solución ingenua al problema de entrada almacenada en búfer no utilizado. Su profesor reconoce el problema, pero parece que no sabe cómo resolverlo correctamente.

Si usa una entrada con formato, solo se utilizan los caracteres ingresados ​​que coincidan con el especificador de formato. Entonces, si, por ejemplo, la última entrada solicitó un entero decimal con% d, puede ingresar en la consola:

123

La entrada formateada consumirá el “123”, dejando el búfer. Una entrada sin formato como getchar () consumirá eso y regresará de inmediato. Ya que esto no es lo que quieres, tu profesor ha usado el “solo agrega otro getchar () kludge”. Esto funciona solo si el usuario ingresa la entrada esperada. Un mecanógrafo desquiciado podría escribir:

123w

Ahora, el primer getchar () obtiene la ‘w’, el segundo obtiene la , y su progtwig finaliza antes de lo previsto, y en un entorno GUI, si el proceso de finalización posee la ventana en la que se está ejecutando, entonces OS lo cierra.

Una solución más robusta es llamar repetidamente a getchar () hasta que se encuentre :

 while( getchar() != '\n' ) { /*do nothing*/} ; getchar() ; /* wait */ 

Por supuesto, si la entrada anterior era un carácter, debe comprobar que ya no era una :

 while( ch != '\n' && getchar() != '\n' ) { /*do nothing*/} ; getchar() ; /* wait */ 

En lugar de poner el ciclo de descarga al final justo antes de la llamada de entrada de ‘espera’, es mejor realizar la descarga del búfer después de cada entrada que lo requiera. Esto se debe a que es donde usted sabe que lo necesita y cómo debe codificarse. Tiendo a escribir funciones de envoltorio para los tipos de entrada que necesito.

getchar(); al final del progtwig se crea una situación de “Presione cualquier tecla para continuar”. Supongo que le gusta pulsar cualquier tecla dos veces.

Para recuperar un “\ n” restante del búfer para que la aplicación se cierre.

Debido a que una pulsación del botón “entrar” genera dos caracteres en Windows, vea wikipedia . Al menos lo usó también, hace mucho tiempo en una galaxia muy lejana …