我正在编译一个用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:
谢谢, 赫里斯托斯
答案 0 :(得分:3)
如Windows this thread所述:
致电
fflush(stdout)
后,您需要printf()
。
另外,由于bug 27663,对Eclipse控制台执行printf()
不会刷新,直到printf()的缓冲区变满为止。
这有各种与Windows控制台相关的错误:bug 102043和bug 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
。