¿Por qué el programa no ejecuta la instrucción printf final?

No puedo entender por qué el control del programa no llega al tercer printf, justo después del bucle for.

¿Por qué el tercero no printf ¿impresión?

Si cambio el bucle for al bucle while, todavía no se imprimirá.

Aquí está el programa y la salida:

main()
{
    double nc;

    printf ("Why does this work, nc = %f\n", nc);
    for (nc = 0; getchar() != EOF; ++nc)
    {
        printf ("%.0f\n", nc);
    }
    printf ("Why does this work, nc = %f", nc);
}

El resultado es:

Why does this work, nc = 0.000000
test
0
1
2
3
4

preguntado el 30 de junio de 12 a las 22:06

Intente agregar una nueva línea al último printf. -

esto puede responder a su pregunta: stackoverflow.com/a/1716621/748875 -

Por interés: por qué double para nc? Seguramente un int seria mas tradicional? -

2 Respuestas

Funciona bien para mí, ¿cómo estás tratando de terminar el programa? los for-el ciclo debe terminar una vez EOF se detecta como entrada por getchar().

EOF is Control-Z (^Z) en Windows y Control-D (^D) bajo Linux/Unix. Una vez que ingreso esto, el ciclo termina y obtengo el final printf() para mostrar su salida.

Como nota final (como lo menciona @DanielFisher también), agregue un '\n' al final de tu final printf() llame, ya que puede ser requerido por su implementación particular o, de lo contrario, el comportamiento del programa podría no estar definido (gracias a @KeithThompson y @AndreyT al señalar esto en los comentarios):

 printf ("Why does this work, nc = %f\n", nc);

Respondido 01 Jul 12, 00:07

El final \n no es solo estilístico. Está definido por la implementación si un final '\n' is son requeridos. Si es necesario, si no se proporciona uno, el comportamiento del programa queda indefinido. - Keith Thompson

@KeithThompson Interesante, ¿podría dar más detalles sobre este requisito? No había oído hablar de esto antes. ¿Tiene que ver con si hace que se vacíe el búfer de salida? - Levon

@Levon: la especificación del idioma establece en 7.19.2/2 con respecto a los flujos de texto: "Si la última línea requiere un carácter de nueva línea de terminación, está definido por la implementación". - Hormiga

¿Por qué el voto negativo? Estaría feliz de mejorar la respuesta o corregir cualquier error, pero no es útil para OP, SO o para mí sin una explicación. - Levon

@AndreyT Gracias ... Lo acabo de encontrar y lo leí. Eliminadas todas las referencias a la estilística :) - Levon

printf está amortiguado, por eso la línea final puede no se mostrará. Eso significa una llamada a printf puede que no resulte en una salida directa ya que la función acumula datos antes de ponerlos en la salida (su terminal).

Una llamada a fflush después de su último printf pondrá todo lo que queda en el búfer en su terminal. Además, el búfer se vacía cada vez que solicita una nueva línea.

Respondido el 30 de junio de 12 a las 22:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.