如何在fgets循环中正确刷新stdin

我已经找到了使用while((c = getchar()) != '\n' && c != EOF)清除stdin的示例,并尝试在通过fgets获取输入的循环中使用它。 我需要刷新,因为循环从最后一个输入获取\ n字符并再次运行它。

所以会发生的事情是我现在必须按两次输入。 为什么会发生这种情况,我该如何解决这个问题呢?

 #define BUFFER_LIMIT 50 do { int c; while ((c = getchar()) != '\n' && c != EOF); printf("console> "); fgets(input_buffer, BUFFER_LIMIT-1, stdin); if(do_something(input_buffer)) break; } while(strncmp(input_buffer, "quit", 4) != 0); 

所以会发生的事情是我现在必须按两次输入。 为什么会发生这种情况,我该如何解决这个问题呢?

好吧,这就是你的代码正在做的事情 – 它首先读取char-by-char,直到它找到换行符。 然后它调用fgets() ,这将…读取,直到找到换行符(可能是char-by-char,但也可能以其他方式)。

你可以试试fflush(stdin) ,但这并不能保证做你想做的事情(它只保证输出缓冲区,而不是输入)。

此外,您可以尝试使用setbuf(stdin, NULL)来禁用标准输入上的缓冲,因此无需刷新。 我在不同的系统上尝试了几次并且它有效,但是这个function的文档并不是100%明确的。