【问题标题】:trouble with Eclipse compilerEclipse 编译器的问题
【发布时间】:2014-10-03 09:48:35
【问题描述】:

我用Eclipse编译c代码,突然间我的所有代码都出问题了,之前都是正确的。

例如,如果我想使用 scanf 输入参数,在 scanf 之前我将使用 printf 语句来引导用户。比如 printf("输入尺寸\n");但是在控制台中编译后,我需要先输入大小,然后才会弹出 printf("type the size\n") 命令,这应该是相反的。

#include <stdio.h>
#include <stdlib.h>

void try(int a);

int main(void)
{
    int a;

    printf("type the size\n");
    try(a);

    return 0;
}

void try(int a)
{
    scanf("%d", &a);
    printf("%d\n", a);
}

结果: 2 输入尺寸 尺寸选择 2 我需要先输入一个数字,这里就像我需要先输入 2 一样,然后“输入大小”才会弹出。

这就是我想要的:

输入尺寸 2 尺寸选择 2

【问题讨论】:

  • Eclipse 不是编译器...
  • 对不起,我使用 Eclipse 和 MinGW GCC 编写 C 代码
  • 顺便说一句,try(a) 不会将输入的值传递到函数之外。您需要传递一个指向 a 的指针以将其写入原位,或者最好从函数返回 aa = try();。最后,try 是 C++ 中的保留字,因此最好选择一个不同的名称。
  • 如何在输出中得到size is chosen
  • 不不不,这只是一个测试而不是真正大小的读出代码

标签: c


【解决方案1】:

它是bug in eclipse,大多数使用 eclipse 和 MinGW 的人都报告了这一点。

为了解决这个问题,您可以在每次调用 printf 之后使用 fflush(stdout) 或在 main 的开头使用以下内容:

setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);

这将导致stdoutstderr 在写入时立即刷新。

【讨论】:

    【解决方案2】:

    试试这个,例如,

    #include <stdio.h>
    #include <stdlib.h>
    void try(int *a);
    int main() {
     int a;
     printf("type the size\n");
     fflush(stdout);
     try(&a);
     return 0;
    }
    void try(int *a){
     scanf("%d", a);
     printf("%d\n", *a);
     fflush(stdout);
     return;
    }
    

    另外,你需要在 main 中获取 atry 中设置的值,所以,你需要传递一个如图所示的指针

    【讨论】:

    • 这并不能解决实际问题。在第一个printf 之后,缓冲区不会在scanf 之前从try 刷新。 C 标准明确了它应该在第一次遇到scanf 之前被刷新,所以这显然是 Eclipse 中的一个错误。一种解决方法是通过@CoolGuy 指出的fflush 标准函数强制它。
    • 是的,你可以在每次 printf 后使用 fflush(stdout),编辑我的答案,接受吗?
    • 您的代码仍然错误。你混淆了第一个printf(来自main)和来自try的第二个。
    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多