c - 在 C 语言中,每次使用 scanf 清除缓冲区时,我都应该使用 FLUSH 吗?

标签 c while-loop buffer scanf

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

while(getchar() != '\n'); 

每次我使用scanf? 谁能解释一下背后的逻辑

while(getchar() != '\n');

谢谢。

最佳答案

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

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

  • 不要将 scanf 与其他输入法混合使用。例如,不要将它与 fgets
  • 混合使用
  • 在格式说明符前加一个空格,其中空格不会被忽略,您希望它被忽略

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


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

  • 使用 fgets 读取整个字符串,然后您可以使用 sscanfstrtok 等随意解析。它可能看起来很矛盾,在 scanf 不足的地方推荐 sscanf。关键是一旦您使用 fgets 安全地存储了完整的字符串,您就可以更自由地分析它,抛出不匹配的部分,执行 strchr到处都是

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

  • 使用成熟的词法分析器

关于c - 在 C 语言中,每次使用 scanf 清除缓冲区时,我都应该使用 FLUSH 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15146672/

相关文章:

Javascript 数组在 Pop 循环时插入内部

json - 将 JSON 对象转换为 Buffer 并将 Buffer 转换为 JSON 对象

c - 如何在写操作之前缓存/缓冲数据

c++ - 一元运算符 "-"对 C/C++(以及不同的编译器)中的无符号数据类型有何作用?

c - 列表连接算法如何工作?

java - 退出 while 语句后 if 语句不起作用

c - 为什么 getch() 不读取输入的最后一个字符?

c - C 中随机二进制数的生成

c - 如何将文件指针 ( FILE* fp ) 转换为文件描述符 (int fd)?

java - 将文本文件转换为全部大写字母