以带有输入rc = scanf("%f", &flt);
的42ex
为例。 scanf
的实现将读取42e
,以为它会在此之后遇到数字或符号,并在读取x
时首先意识到它没有得到该数字或符号。此时是否应同时推回x
和e
?还是应该只推回x
。
我问的原因是,GNU的libc将在随后的gets
调用上返回ex
,指示它们已经将x
和e
都推回了,但是该标准说:
我将其解释为42e
是匹配输入序列的前缀(因为42e1
是匹配的输入序列),这意味着它会将42e
视为应被读取的输入项,而仅将x
保留为未读。如果流仅支持单个字符回推,则实现起来也将更加方便。
最佳答案
您对标准的解释是正确的。在C标准中甚至还有一个示例,其中说100ergs of energy
不应该与%f%20s of %20s
相匹配,因为100e
无法与%f
相匹配。
但是大多数C库似乎以不同的方式实现了这一点,这可能是由于历史原因。我刚刚在macOS上检查了C库,其行为类似于glibc。乌尔里希·德雷珀(Ulrich Drepper)的以下解释将corresponding glibc bug作为WONTFIX进行了关闭: