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

void delay(double sec)
{
    clock_t start = clock();

    while ((clock() - start) / CLOCKS_PER_SEC < sec)
        ;       
}

int main()
{
    for (int i = 0; i < 100000; i++) {
        printf("%d  ", i);
        delay(1);
    }

    return 0;
}

我写了一个延迟函数并用这段代码对其进行了测试,但是在标准输出中我没有看到任何数字。

然后我像这样更改了 printf() 调用:

printf("%d \n", i);

有趣的是,它奏效了。我也尝试过这样的无延迟功能:

    for (int i = 0; i < 100000; i++)
        printf("%d  ", i);

它也奏效了。我在这里想念什么?为什么我在运行第一个代码时看不到任何数字?感谢您的帮助:)

4

2 回答 2

1

因为输出是缓冲的。大多数终端将缓冲标准输出,直到\n遇到换行符 ( ) 或被fflush(stdout)调用。

包含调用的循环delay最终应该打印数字,但是当程序完成时。

fflush(stdout);在 -call 之后添加printf,使数字立即出现,中间没有换行符。

于 2014-01-05T21:19:57.477 回答
1

嗯,有两个原因。首先,printf()并不总是刷新它的输出,所以你实际上可能通过了printf语句并且仍然在你的终端上看不到任何东西。文本被缓冲。放入 a\n可能会导致它刷新其输出,所以这就是它起作用的原因。

第二个问题是您没有将任何值传递给您的delay()函数。所以它可能使用了一些随机值,然后挂起。

我还想指出,它clock()返回的是 CPU 时间,而不是“挂钟”时间,所以它实际上可能需要比你想象的更长的时间。

延迟函数很棘手,这就是为什么有很多系统调用来执行它们的原因。见sleep()

于 2014-01-05T21:20:35.103 回答