在Unix和Windows中运行程序的区别

4
我正在编译一份简单的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上,我必须先输入所有内容,然后它才会打印出所有的行。我不确定为什么会出现这种情况……Windows和Mac之间有什么区别?
Input first class info:
Credit Hours: 4
Letter Grade: B+

Windows:

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

感谢您,Hristo。

如果您在命令行而不是通过Eclipse运行程序,会发生什么? - caf
7个回答

3

此讨论在Windows中提到:

在调用printf()后需要使用fflush(stdout)

此外,由于bug 27663的存在,向Eclipse控制台输出printf()不会立即刷新,直到printf()的缓冲区被填满。
这对于Windows控制台有各种相关的错误:bug 102043bug 121454


谢谢,问题已解决。在 scanf() 之前,我需要在每个 printf() 后清空缓存吗? - Hristo
@Hristo:在你希望在执行下一行之前看到所有数据的时间和地点进行操作。我建议不要在每个printf后盲目地放置fflush,因为如果在I/O密集型应用程序中过度使用会降低性能。 - RC.
@RC:我同意。这是在提到的主题讨论中的情境下。 - VonC

1

这很可能是由于缓冲区缓存差异引起的。

尝试:

fflush(stdout);

在你的scanf之前加上fflush(stdout)。这将强制输出刷新到屏幕上,以便在需要查看时能够看到它。

1

Windows和Mac在缓冲控制台输出方面有所不同。如果您希望立即显示它,您需要通过调用flush来刷新它。

fflush(stdout);

在 printf 之后。


1
我猜在Mac OS X上,"\n"会导致stdout刷新,而在Windows上则不然。尝试在你的print语句之后、scanf语句之前加入以下代码片段:
fflush(stdout);

0

就像Fyodor所说的那样,这很可能是一个行尾问题。

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

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

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


0
除了关于fflush()的答案之外,你的代码还存在缓冲区溢出的问题。scanf()函数读入字符到变量b中时写入了3个字节-{ 'B', '+', '\0' }-并且你的数组没有足够的空间来存储NUL终止符。你需要使用宽度为3个字符的缓冲区或使用其他方法而不是scanf(%s)读取其中的2个字符。

-1

你应该使用 \r\n 而不是 \n


2
标准输出以文本模式打开,这意味着纯粹的\n会被转换为本机行尾符。 - caf
@caf,但是Windows显然是非标准的...你可以预料到在Windows机器上会出现任何行为。 - Michael Aaron Safyan
@Michael:这与Windows无关。库是Eclipse的责任。 - Fyodor Soikin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接