【发布时间】: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