【问题标题】:running a program in Unix vs in Windows在 Unix 和 Windows 中运行程序
【发布时间】:2010-05-12 03:56:24
【问题描述】:

我正在编译一个用 C 编写的简单程序,并且在 Windows 7 和我的 MacBook Pro 上都使用 Eclipse 作为 IDE。我朋友写的非常简单的程序,请我帮助他:

int a = 0;
char b[2];
printf("Input first class info:\n");
printf("Credit Hours: \n");
scanf("%d", &a);
printf("Letter Grade: ");
scanf("%s", b);

所以当我在我的 mac 上运行它时,每一行都会打印出来,当我遇到 scanf() 时,我可以按预期输入并继续。在 Windows 中,我必须输入所有内容,然后它会打印所有行。我不确定为什么会这样……这里的黑白 Windows 和 Mac 有什么区别?

苹果机:

Input first class info:
Credit Hours: 4
Letter Grade: B+

窗户:

4
B+
Input first class info:
Credit Hours:
Letter Grade:

谢谢, 赫里斯托

【问题讨论】:

  • 如果您在命令行而不是通过 Eclipse 运行程序会发生什么?

标签: c windows eclipse unix


【解决方案1】:

正如this thread 在 Windows 上所说:

在致电printf() 后,您需要fflush(stdout)

另外,由于bug 27663,对 Eclipse 控制台执行printf() 不会刷新,直到 printf() 的缓冲区变满。
这有各种与 Windows 控制台相关的错误:bug 102043bug 121454

【讨论】:

  • 感谢修复。我需要在 scanf() 之前的每个 printf() 之后刷新吗?
  • @Hristo:您需要在您关心的时间和地点执行此操作,以便在执行下一行之前查看所有数据。我建议不要盲目地将 fflush 放在每个 printf 之后,因为如果在 I/O 密集型应用程序中过度使用它会降低性能。
  • @RC:我同意。这是在提到的线程的上下文中。
【解决方案2】:

这可能是由于缓冲区缓存差异造成的。

试试:

fflush(stdout);

在您的 scanfs 之前。当您需要查看输出时,这将强制将输出刷新到屏幕上。

【讨论】:

    【解决方案3】:

    Windows 和 Mac 缓冲控制台输出的方式不同。如果您希望它立即出现,您需要通过调用来刷新它

    fflush(stdout);
    

    在 printf 之后。

    【讨论】:

      【解决方案4】:

      我的猜测是,在 Mac OS X 上,“\n”会导致标准输出被刷新,而在 Windows 上却不是这样。尝试在 print 语句之后和 scanf 语句之前添加以下代码:

      fflush(stdout);
      

      【讨论】:

        【解决方案5】:

        正如 Fyodor 所说,这很可能是行尾问题。

        在 Windows 上,行尾是“\r\n”(回车后跟换行)。

        在 Mac OSX 上,行尾只是“\r”,但“\r\n”也可以,因为它包含“\r”。

        在 Unix/Linux 上,行尾通常只是“\n”。

        【讨论】:

          【解决方案6】:

          除了关于需要fflush() 的答案之外,您的代码还包含缓冲区溢出。 b 中的 scanf() 写入 3 个字节 - { 'B', '+', '\0' } - 并且您的数组没有足够的空间来存储 NUL 终止符。你要么需要一个 3 个字符宽的缓冲区,要么使用 scanf(%s) 以外的东西和 a 来读取 2 个字符。

          【讨论】:

            【解决方案7】:

            您想使用\r\n 而不是\n

            【讨论】:

            • 没有。标准输出以文本模式打开,这意味着普通的 \n 被转换为任何本机行结尾。
            • @caf,但话说回来,Windows 是公然非标准的......你几乎可以期待 Windows 机器上的任何行为。
            • @Michael:这与 Windows 无关。库是 Eclipse 的责任。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-21
            • 1970-01-01
            • 2010-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-09
            相关资源
            最近更新 更多