使用for时理解程序顺序(; clock() - now< CLOCKS_PER_SEC;)

时间:2015-11-16 13:24:59

标签: c linux

Hie guys我是初学者C程序员,当我编写一个简单的终端手表时,我注意到我的代码执行顺序有问题:不是显示我运行程序的时间,首先光标闪烁大约3秒钟,然后显示时间。这是我的代码:

#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秒然后退出
  4. 然而,在显示“1 2 3 4”

    之前,它首先等待5秒钟
    #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()之前运行for printf()函数。更正非常受欢迎。谢谢。

1 个答案:

答案 0 :(得分:2)

您很可能只看到输出缓冲的效果。请注意,与'\r'不同,'\n'通常不会刷新输出缓冲区。因此,请使用fflush()强制执行所需的行为,例如

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