C,冲洗stdin

我有使用fgets的问题。 该循环应该读取一行最大值。 19个字符,分析此char数组,然后等待下一个输入。 问题是如果输入的行输出19个字符,fgets将用剩余的字符填充str,直到输入Ctrl-D或换行符,从而启动一个没有新输入的新循环。 在读取19个字符后,输入(stdin)应以某种方式刷新,因此循环可以以干净的平板开始。 有人有解决方案吗?

char str[20]; while((fgets(str, 20, stdin) != NULL)) { puts(str); //monitoring str if(str[0] == 'q') break; } 

使用示例:

 hola hola //user inputs 9 chars + newline hola hola //puts writes hoo hoo hoo hoo hooh //user inputs 20 chars + newline hoo hoo hoo hoo hoo //puts writes h // 

scanf("%*[^\n]\n"); 可能是最简单的可能性之一。

 char str[21]; /* read one extra character */ while (fgets(str, 21, stdin) != NULL) { /* if line too long, truncate and swallow the rest of the line */ if (strlen(str) > 19) { str[19] = '\0'; while (getchar() != '\n' && !feof(stdin)) ; } puts(str); if(str[0] == 'q') break; } 

另一种可能的变量,fgets()约束是唯一使用的输入和循环级别。 这绝对与larsman提出的非常相似。 所以我想我会为他投票:-)

 #include  int main(){ char str[20]; int skip = 0; str[19] = 1; while (fgets(str, 20, stdin)) { // just ignore lines of more than 19 chars if (str[19] == 0){ str[19] = 1; skip = 1; continue; } // also skip the end of long lines if (skip) { skip = 0; continue; } // monitor input puts(str); // stop on any line beginning with 'q' if (str[0] == 'q'){ break; } }; } 

看看fpurge:

 fpurge(stdin); 

尝试:

 fgets(str, 2000, stdin) 

然后将str截断为19 🙂