2015-11-16 2 views
3

Привет, ребята, я начинающий программист на C, и, когда я программировал простую терминальную систему, я заметил, что возникла проблема с последовательностью выполнения мой код: вместо отображения времени, когда я запускаю программу, сначала курсор мигает примерно 3 секунды, а затем отображается время. Вот мой код:Понимание последовательности программ при использовании для (; clock() - now <CLOCKS_PER_SEC;)

#include <time.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define BUFSIZE 10 

int main(int argc, char** argv) 
{ 
    time_t t; 
    size_t sz; 
    clock_t now; 
    struct tm* tm; 
    static char strtm[BUFSIZE]; 

    while (1) 
    { 
     now = clock(); 
     t = time(NULL); 
     tm = gmtime(&t); 

     sz = strftime(strtm, sizeof(strtm), "%T", tm); 

     #if 1 
     for (;(clock() - now) < (CLOCKS_PER_SEC/3);) 
      printf("\r"); 
     #endif 

     printf("%s", strtm); 
    }  

    return 0; 
} 

Итак, чтобы проверить последовательность программ, я написал следующий простой код, и он ведет себя аналогичным образом. То, что я хочу, следующий код, чтобы сделать это

  1. Дисплей "1 2 3 4",
  2. Переместите курсор на '1',
  3. ждать около 5 сек, а затем выйти из

Однако, вместо того, чтобы делать что это первый ожидает в течение 5 секунд до отображения «1 2 3 4»

#include <time.h> 
#include <stdio.h> 

int main() 
{ 
    clock_t now = clock(); 

    printf("1 2 3 4"); 

    printf("\r"); 

    for (;(clock() - now) < (5 * CLOCKS_PER_SEC);) 
    ; 

    return 0; 
} 

Я работаю на Linux, так что я попытался с помощью-й е sleep() функция, и я получил тот же результат:

#include <unistd.h> 
#include <stdio.h> 

int main() 
{ 
    printf("1 2 3 4"); 

    printf("\r"); 

    sleep(5); 

    return 0; 
} 

Мне нужно, чтобы вы помогли мне понять последовательность моей программы, потому что, кажется, запустив для loop/sleep() функции первого до printf(). Исправления очень приветствуются. Спасибо.

ответ

2

Вы, скорее всего, просто видите эффект буферизации вывода. Обратите внимание, что '\r' обычно не выравнивает выходной буфер, в отличие от '\n'. Поэтому используйте fflush() для обеспечения требуемого поведения, например.

printf("1 2 3 4"); 
printf("\r"); 
fflush(stdout); 
+1

Спасибо @Paul R Я попробовал ваш ответ на все программы, и теперь они в порядке – Minathe