我正在尝试使用Eclipse IDE和GDB调试器来调试需要用户输入的C程序。每次我在控制台中输入用户输入时,我的输入都会显示两次。换句话说,我的输入回显了相同的值。例如,如果我调试以下C程序:
#include <stdio.h>
int main(void) {
int length, width, height;
printf("Enter length: ");
scanf("%d", &length);
printf("Enter width: ");
scanf("%d", &width);
printf("Enter height: ");
scanf("%d", &height);
printf("Volume = %d\n", length*width*height);
return 0;
}
,然后控制台看起来像这样:
Enter length: 2
2
Enter width: 3
3
Enter height: 4
4
Volume = 24
如您所见,值2,3和4分别显示两次。运行此程序(而不是调试)会得到预期的结果:
Enter length: 2
Enter width: 3
Enter height: 4
Volume = 24
此外,我注意到printf()
语句的执行被延迟了:虽然我已经点击了#34;跳过&#34;,但控制台中没有显示任何内容。为了使这个问题更加明显,让我们将代码更改为:
#include <stdio.h>
int main(void) {
int length, width, height;
printf("Enter length: ");
printf("Enter length: "); // newly added line
printf("Enter length: "); // newly added line
scanf("%d", &length);
printf("Enter width: ");
scanf("%d", &width);
printf("Enter height: ");
scanf("%d", &height);
printf("Volume = %d\n", length*width*height);
return 0;
}
在这种情况下,字符串&#34;输入长度:输入长度:输入长度:&#34;在我跨过第9行:scanf("%d", &length);
后,将一次显示。但是,如果我添加一个新行字符&#39; \ n&#39;在每次拨打printf()
时,最后都没有问题,字符串将立即打印到控制台。
我知道这两个问题都是微不足道的,但作为强迫症,我真的想知道这里发生了什么。我想这与Eclipse如何处理输入和输出有关?但是在Eclipse中调试java程序时,我再也看不到这些问题了。
PS。我在Mac OS X El Capitan,用于C / C ++开发人员的Eclipse(Mars)IDE上运行,我根据此处给出的说明安装了GDB和Homebrew:http://ntraft.com/installing-gdb-on-os-x-mavericks/。
提前感谢您的回答。
答案 0 :(得分:1)
正在缓冲输出。新行字符刷新缓冲区并在屏幕上显示结果。这就是为什么在添加\n
时你没有使用issule的原因。
或者,您可以尝试在printf语句后添加fflush(stdout);
。
另外,我还建议您使用Xcode代替Eclipse而不是Eclipse。