2012-06-30 4 views
0

Я не могу понять, почему управление программой не достигает третьего printf, сразу после цикла for.Почему программа не выполняет окончательный вывод printf?

Почему не третий printf принт?

Если я изменил цикл for на цикл while, он все равно не будет печататься.

Вот программа и вывод:

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); 
} 

Выход:

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

Попробуйте добавить новую строку к последнему printf. –

+0

это может ответить на ваш вопрос: http://stackoverflow.com/a/1716621/748875 – Simon

+0

Из интереса: почему 'double' для nc? Неужели «int» будет более традиционным? – LeoNerd

ответ

4

Он отлично работает для меня, как вы пытаетесь termintate программу? for -loop должен заканчиваться один раз EOF определяется как входной сигнал getchar().

EOF является Control-Z (^Z) под Windows, и Control-D (^D) под Linux/Unix. Как только я вхожу в это, цикл завершается, и я получаю окончательный printf(), чтобы отобразить его вывод.

В заключительной ноте (как указано на @DanielFisher тоже), добавьте '\n' в конце вашего окончательного printf() вызова, как это может потребоваться вашей конкретной реализации или иначе поведение программы может быть неопределенным (благодаря @KeithThompson и @AndreyT указывают на это в комментариях):

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

Конец '\ n' не просто стилистический. Определяется реализация: требуется ли завершающий '' \ n'' *. Если это необходимо, неспособность обеспечить одно из них делает поведение программы неопределенным. –

+1

@KeithThompson Интересно, не могли бы вы подробно остановиться на этом требовании, о котором я раньше не слышал. Имеет ли это отношение к тому, вызывает ли сброс выходной буфер? – Levon

+1

@Levon: спецификация языка заявляет в 7.19.2/2 в отношении текстовых потоков: «Требуется ли последняя строка для конечного символа новой строки». – AnT

0

printf буферизуется, поэтому последняя строка может не будет отображаться. Это означает, что вызов printf может не привести к прямому выводу, поскольку функция накапливает данные перед тем, как поместить их в выход (ваш терминал).

Вызов fflush после того, как ваш последний printf поместит все, что останется в буфере в вашем терминале. Кроме того, буфер очищается каждый раз, когда вы запрашиваете новую строку.

Смежные вопросы