在C中,每次使用scanf摆脱缓冲区时,我都应该使用FLUSH吗?

slo*_*low 0 c buffer scanf while-loop

正如标题所说,我应该使用

while(getchar() != '\n'); 
Run Code Online (Sandbox Code Playgroud)

每次我使用scanf?有人可以解释背后的逻辑

while(getchar() != '\n');
Run Code Online (Sandbox Code Playgroud)

谢谢.

cni*_*tar 6

不,你通常不需要这样做.你发布的循环读取字符,stdin直到它遇到一个不是\n.你编写它的方式,就像换行符一样,最后一个非换行符也会丢失.

通过以下方式可以避免典型问题或"冲洗"的需要:

  • scanf与其他输入法混合使用.例如,不要与它混合fgets
  • 前面的格式说明符,其中的空格不会被忽略,您希望忽略它

例如,要忽略空格,而不是scanf("%c"...)使用空格scanf(" %c"..).


除此之外,当您有复杂的输入要读入时,您可能希望:

  • 读取整个字符串fgets,然后您可以随意解析sscanf,strtok等等.它可能看起来像一个矛盾,建议sscanf哪里scanf不充分.关键是,一旦你使用安全存储完整的字符串fgets,你就可以更自由地分析它,抛出不匹配的部分,在strchr这里和那里做等等

  • 使用更适合作业的语言(带库),如python或perl,可以将任务简化为更简单的问题

  • 使用成熟的词法分析器