什么是`scanf`应该与不完整的指数部分做什么?

sky*_*ing 11 c glibc c99 language-lawyer

rc = scanf("%f", &flt);输入为例42ex.scanf读取的实现会42e认为它会在之后遇到一个数字或符号,并在读取时首先意识到x它没有得到它.如果它在这一点上推回都xe?或者它应该只推回x.

我想问的原因是将GNU的libc中的后续调用gets返回ex表明他们已经推后两xe,但标准说:

除非规范包含n个指定符,否则从流中读取输入项.输入项目被定义为输入字符的最长序列,其不超过任何指定的字段宽度,并且是匹配输入序列的前缀或后缀[245]输入项目之后的第一个字符(如果有)仍然未读.如果输入项的长度为零,则指令的执行失败; 除非文件结束,编码错误或读取错误阻止了流的输入,否则此条件是匹配失败,在这种情况下,它是输入失败.

我将其解释为因为42e匹配输入序列的前缀(因为例如42e1将是匹配的输入序列),这应该意味着它将被42e视为应该被读取的输入项而仅留下x未读.如果流仅支持单个字符回退,那么实现起来也会更方便.

nwe*_*hof 8

您对标准的解释是正确的.在C标准中甚至还有一个例子,它说不100ergs of energy应该匹配,%f%20s of %20s因为100e无法匹配%f.

但是大多数C库似乎都有不同的实现方式,可能是由于历史原因.我刚刚检查了macOS上的C库,它的行为类似于glibc.在相应的glibc的错误被封闭,WONTFIX与乌利齐·德雷珀如下解释:

这是ISO C委员会方面的愚蠢,这与现有做法背道而驰.任何更改都可能破坏现有代码.