我尝试使用 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()
语句的执行被延迟了:虽然我已经点击了“step over”,但控制台中没有显示任何内容。为了使这个问题更加明显,让我们将代码更改为:
#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;
}
在这种情况下,字符串“Enter length: Enter length: Enter length:”将在我跨过第 9 行后立即显示:scanf("%d", &length);
。但是,如果我每次调用 printf()
时都在末尾添加换行符 '\n',那么就没有问题,字符串会立即打印到控制台。
我知道这两个问题是微不足道的,但作为强制症,我真的很想知道这里发生了什么。我想这与 Eclipse 如何处理输入和输出有关?但话又说回来,在 Eclipse 中调试 Java 程序时,我没有看到这些问题。
附言。我在 Mac OS X El Capitan 和面向 C/C++ 开发人员的 Eclipse (Mars) IDE 上运行,并且我根据此处给出的说明使用 Homebrew 安装了 GDB:http://ntraft.com/installing-gdb-on-os-x-mavericks/ .
预先感谢您的回答。
最佳答案
正在缓冲输出。换行符刷新缓冲区并将结果显示在屏幕上。这就是添加 \n
时没有问题的原因。
或者,您可以尝试在 printf 语句之后添加 fflush(stdout);
。
此外,我还建议您使用 Xcode for Mac 而不是 Eclipse。
关于c - 使用 GDB 在 Eclipse 中调试 C 程序时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36114441/