【问题标题】:What to do when user input exceeds the desired bound using fgets?当用户输入超出使用 fgets 的期望范围时该怎么办?
【发布时间】:2017-07-30 19:12:07
【问题描述】:

我想知道当我将 fgets 中的缓冲区大小设置为 n 字节并且用户输入 2n 字节时如何处理? fgets 将读取前 n 个字节,其他 n 个字节将保留在标准输入中,对吗?在每次 fgets 之后刷新标准输入是否是个好主意,是否有其他选项来处理这种情况?

【问题讨论】:

  • 不要刷新标准输入,这是未定义的行为。相反,使用 fgetc() 循环直到 EOF。
  • @Jean-FrançoisFabre EOL 大概...
  • 这取决于你想做什么?丢弃其余的行?调整输入缓冲区的大小?
  • 在这种情况下,我通常会增大输入缓冲区(例如,使用 realloc 将大小翻倍)并继续读取。是的,剩余的字节保留在标准输入中,可以被后续的 fgets 调用读取。
  • 一个好的答案需要解决程序的更高级别的目标 - 没有说明。附加计划的目标以获得好的适用想法 - 否则这太宽泛了。

标签: c


【解决方案1】:

您知道输入何时因输入字符串末尾缺少'\n' 换行符而被截断。

可能除了文本文件中的最后一行,它可能不包含任何换行符。

如果有更多输入,您可以realloc 缓冲区(最初使用malloc 获取)并使用适当的缓冲区指针(和大小)重复以追加到您已有的内容。

不需要刷新任何东西,只需将右指针和额外的缓冲区大小传递给fgets

无论如何,使用fflush() 刷新输入的定义并不明确。

【讨论】:

  • 好点。也许为剩余的字符添加刷新输入的方式以进行投票?
  • @Jean-FrançoisFabre 很想提供一个代码示例,但 OP 没有提供任何示例。
  • @Jean-FrançoisFabre re OP 的问题 在每个 fgets 之后刷新标准输入是否是个好主意 - 没有理由刷新您真正想要的输入。跨度>
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 2015-07-25
  • 2012-05-11
相关资源
最近更新 更多