【问题标题】:What should scanf return on EOF after partial match?部分匹配后 scanf 应该在 EOF 上返回什么?
【发布时间】:2011-08-12 08:53:35
【问题描述】:

考虑以下scanf 转换说明符和输入:

  • "%4c""abc"
  • "%x""0x"
  • "%f""1.0e+"

也就是说,输入是匹配的初始子序列,但不是匹配的情况。假设在不完全匹配后达到 EOF,scanf 应该返回EOF 还是0? C99 中的文字如下:

如果在任何转换之前发生输入失败,fscanf 函数将返回宏 EOF 的值。否则,该函数返回分配的输入项的数量,如果发生早期匹配失败,该数量可能少于提供的数量,甚至为零。

在 POSIX 2008 中,它显示为:

成功完成后,这些函数应返回成功匹配和分配的输入项的数量;如果发生早期匹配失败,此数字可以为零。如果输入在第一次匹配失败或转换之前结束,则返回 EOF。如果发生错误,则返回EOF,设置[CX]和errno来指示错误。如果发生读取错误,则应设置流的错误指示符。

我不清楚部分但不完整的匹配是否构成“早期匹配失败”。我会发现在这种情况下返回值 0 更有用(它区分了普通 EOF 和无效截断数据的情况),但我正在寻找的只是帮助解释标准。

请注意,glibc 的 scanf 在所有这些输入上都完全不正确,并返回 1,将无效输入视为匹配项。我很确定这个问题已被报告并标记为 WONTFIX。 :-(

【问题讨论】:

    标签: c scanf standards-compliance


    【解决方案1】:

    我期待 0。

    7.16.6.2/4:

    失败被描述为输入失败(由于发生编码错误或 inout 字符不可用),或匹配失败(由于输入不当)。

    【讨论】:

    • 那是 7.19.6.2,不是吗?第 15 段似乎更具决定性:“如果在输入过程中遇到文件结尾,则终止转换。如果在读取与当前指令匹配的任何字符之前发生文件结尾(除了前导空格,在允许的情况下),当前指令的执行会因输入失败而终止;否则,除非当前指令的执行因匹配失败而终止,否则后续指令(%n 除外,如果有)的执行会因输入失败而终止。”
    • 7.19.6.2。但是您的第 15 段来自 C90,而不是 C99,我找不到相同的语言。
    • OK,C99 7.19.6.2 第 9 段和第 10 段,尤其是第 10 段,似乎是相关的,我认为它们基本上说的是同一件事……
    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2012-04-20
    相关资源
    最近更新 更多