【问题标题】:Why doesn't this small C program work as expected?为什么这个小的 C 程序没有按预期工作?
【发布时间】:2013-08-28 15:21:33
【问题描述】:

我有一个使用 difftime 的小型 C 程序。真的很奇怪,10秒后它不会打印出该行。

但是,如果我取消注释 sleep 行,那么它可以工作。

任何想法为什么会发生这种情况?

/* difftime example */
#include <stdio.h>      /* printf */
#include <time.h>       /* time_t, struct tm, difftime, time, mktime */

int main ()
{
  time_t start, stop;

start = time(NULL);
        for(; /* some condition that takes forever to meet */;) {
        // do stuff that apparently takes forever.
                stop = time(NULL);
                double diff = difftime(stop, start);
                //sleep (1);
                if (diff >= 10) {
                        printf("10 seconds passed...");
                        start = time(NULL);
                }
        }
}

顺便说一句:代码编译得很好,我在 Raspberry Pi 上运行它。 3.6.11+ #474 PREEMPT Thu Jun 13 17:14:42 BST 2013 armv6l GNU/Linux

【问题讨论】:

  • 无法复制。一旦我在printf() 中添加了一个换行符,无论有没有sleep(1),代码都可以正常工作。请描述重现所需的确切步骤。

标签: c


【解决方案1】:

控制台 IO 可能是行缓冲的。尝试冲洗

printf("10 seconds passed...");
fflush(stdout)

或添加换行符\n

printf("10 seconds passed...\n");

当取消注释对 sleep 的调用时,我无法重现任何行为变化。

【讨论】:

  • 但是sleep(1) 会如何改变呢?
  • 谢谢 - 换行 \n 工作。我已经为此苦苦挣扎了好几个小时:)
  • @NPE 我最初错过了sleep 的提及。我无法解释为什么这会影响事情并且无法重现报告的发现。我已经相应地更新了我的答案。
【解决方案2】:
printf("10 seconds passed...\n");

【讨论】:

    【解决方案3】:

    对于 sleep(),您需要包含 unistd.h,并像其他人指出的那样添加换行符。

    #include <stdio.h>      /* printf */
    #include <time.h>       /* time_t, struct tm, difftime, time, mktime */
    #include <unistd.h>     /* sleep() */
    

    如果您的代码在编译时没有警告且未包含 unistd.h,则您需要提高警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2020-07-24
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多