在Eclipse中使用fgets(char * c,int i,file * f)和printf()for C – CDT。 输出顺序不正确。

#include  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 

‘hello world’是我给出的输入。

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

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

该错误标记为“WONTFIX”,评论解释了为什么这是一个难以解决的问题。 他们确实建议了几种解决方法:

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

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