【问题标题】:printf just before a delay doesn't work in C延迟之前的 printf 在 C 中不起作用
【发布时间】:2009-10-06 23:26:17
【问题描述】:

有谁知道为什么如果我在延迟之前放置一个 printf ,它会等到延迟结束后再打印 de 消息?

带有 sleep() 的代码 1:

int main (void)
{
    printf ("hi world");
    system("sleep 3");    
}

具有自我实现延迟的 Code2:

void delay(float sec)
{
    time_t start;
    time_t current;
    time(&start);
    do{
        time(&current);
    }while(difftime(current,start) < sec);
}
int main (void)
{
    printf ("hi world");
    delay(3);    
}

如果:

printf ("hi world");
delay(3);    
printf ("hi world");
delay(3);    

它一直等到睡眠总和,然后同时打印消息

为什么会这样?

更新:当我调用延迟时,我写了延迟(“睡眠 3”),我的意思是延迟(3)。已更正

【问题讨论】:

  • 另外,为了获得更好的延迟功能,请考虑在unistd.h 中声明的标准 POSIX sleep() 函数

标签: c printf


【解决方案1】:

printf 缓冲它的输出,直到输出换行符。

添加fflush(stdout);按需刷新缓冲区。

【讨论】:

  • 您能否提供一个示例,以便清楚何时何地放置fflush 命令。谢谢
【解决方案2】:

在您输出 '\n' 字符之前,标准输出不会刷新。

试试 printf ("hi world\n");

【讨论】:

  • 你是对的 ;)。你是对的 (Ben & FigBug)。非常感谢您的快速回答;)
  • 我不认为简单地添加一个 \n 就可以保证输出将被刷新。在这种情况下,我恰好为你工作。最好按照 FigBug 的建议使用 fflush()。
【解决方案3】:

通常,标准输出会被缓冲,直到您:

  • 输出一个\n 字符
  • 致电fflush(stdout)

在调用 delay() 之前执行这些操作之一,您应该会看到您的输出。

【讨论】:

  • 请注意,如果 stdout 是终端,写入换行符通常只会刷新输出;如果它被重定向到一个文件,写一个换行符不会导致它刷新。
【解决方案4】:

当你调用 printf 时,你不会打印任何东西,直到真正需要:直到缓冲区填满,或者你添加一个新行。或者你明确地刷新它。

所以,你可以这样做

printf("Something\n");
delay();

printf("Something");
fflush(stdout);
delay();

【讨论】:

    【解决方案5】:

    从技术上讲,这甚至不应该编译。在delay("sleep 3") 调用中,您尝试将const char * 转换为float。应该是:

    void delay (float sec)
    {
        // ...
    }
    
    delay(3);
    

    【讨论】:

    • 它会编译,但它会将指针视为浮点数,这可能会做坏事。如果您充分提高编译器的警告,它将无法编译。
    • @Chris 是的,我想它甚至可能只是将指针转换为浮点数,但就像你说的那样,这不是一件好事!
    • 编译器可能至少会抱怨它
    • 我的意思是延迟(3)。输入错误;),我刚刚更新了问题。谢谢让我记下它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多