在 Eclipse - CDT 中使用 fgets(char* c, int i, file* f) 和 printf(


#include <stdio.h>
enum { max_string = 127 };
static char ch[max_string+1] = "";
int main(int argc, char ** argv){
    printf("Type a String: n");
    fgets(ch, max_string, stdin);
    printf("the string is: %s", ch);
    return 0;
}

我使用了这段代码,控制台中的输出是

hello world
Type a String: 
the string is: hello world

"你好世界"是我给出的输入。

我的问题是为什么在这种情况下不维持订单。因为 printf(( 应该在 fgets(( 之前工作,但这里不是这样。我已经在代码::块中使用相同的编译器进行了检查。在那里它按顺序工作。但是在Eclipse-MARS CDT的情况下,我发现它是错误的。

我假设您正在Windows上运行,并且在Windows上的Eclipse CDT中遇到了控制台输出的长期问题。

该错误被标记为"WONTFIX",注释解释了为什么这是一个难以修复的问题。他们确实提出了几种解决方法:

  • 每次呼叫fflush(stdout)后呼叫printf。这将在每个输出操作后显式刷新输出缓冲区。
  • 在程序开始时调用setvbuf(stdout, NULL, _IONBF, 0)一次。这将完全禁用输出缓冲。
  • 使用 CDT 的实验性"winpty"支持,如此处所述。这试图使 Eclipse 的控制台具有与真实终端相同的行为,包括线路缓冲。

我有一个更简单的解决方案建议:使用 Eclipse 构建程序,但直接从终端(命令提示符(运行它。然后,您将获得正确的终端行为,而无需任何解决方法。

最新更新