c - 使用 GDB 在 Eclipse 中调试 C 程序时的奇怪行为

标签 c eclipse debugging gdb

我尝试使用 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/

相关文章:

java - Eclipse:避免将某些依赖项包含在 JUnit 运行时类路径中

eclipse - 带有 Spring Boot 的 Spring MVC 不适用于 Eclipse 的 Tomcat 服务器

typescript - 在 VsCode 中使用附加调试器进行调试时在 Typescript 文件上打断点

debugging - EBP 寄存器(基帧指针)是否仅用于 x86 中的调试?

c - 数字后的后缀 L 是否总是与在数字前放置带有 "long"的括号具有相同的效果?

eclipse - 哪个版本的 OSGi 由哪个版本的 Eclipse/Equinox 实现?

C:使用循环替换字符串中的子字符串

java - Eclipse,无法解决

c - 如何在C中打开一个进程?

c - 解决 KNKING 练习 14,第 8 章。颠倒单词