在Unix和Windows中运行程序

时间:2010-05-12 03:56:25

标签: c windows eclipse unix

我正在编译一个用C编写的简单程序,我在Eclipse 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有什么区别?

的Mac:

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

视窗:

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

谢谢, 赫里斯托斯

7 个答案:

答案 0 :(得分:3)

如Windows this thread所述:

  

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

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

答案 1 :(得分:1)

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

尝试:

fflush(stdout);
在您的scanfs之前

。当您需要查看时,这将强制将输出刷新到屏幕。

答案 2 :(得分:1)

Windows和Mac以不同方式缓冲控制台输出。如果您希望它立即显示,您需要通过调用

来刷新它
fflush(stdout);

在printf之后。

答案 3 :(得分:1)

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

fflush(stdout);

答案 4 :(得分:0)

就像费奥多尔所说,这很可能是一个终结问题。

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

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

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

答案 5 :(得分:0)

除了需要fflush()的答案之外 - 您的代码包含缓冲区溢出。 scanf()到b写入3个字节 - { 'B', '+', '\0' } - 并且您的数组没有足够的空间来存储NUL终结符。您需要一个3个字符宽的缓冲区,或者使用scanf(%s)以外的其他内容来读取2个字符。

答案 6 :(得分:-1)

您想使用\r\n代替\n