以带有输入rc = scanf("%f", &flt);42ex为例。 scanf的实现将读取42e,以为它会在此之后遇到数字或符号,并在读取x时首先意识到它没有得到该数字或符号。此时是否应同时推回xe?还是应该只推回x

我问的原因是,GNU的libc将在随后的gets调用上返回ex,指示它们已经将xe都推回了,但是该标准说:



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

最佳答案

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

但是大多数C库似乎以不同的方式实现了这一点,这可能是由于历史原因。我刚刚在macOS上检查了C库,其行为类似于glibc。乌尔里希·德雷珀(Ulrich Drepper)的以下解释将corresponding glibc bug作为WONTFIX进行了关闭:

09-28 12:26