sky*_*ing 11 c glibc c99 language-lawyer
以rc = scanf("%f", &flt);
输入为例42ex
.scanf
读取的实现会42e
认为它会在之后遇到一个数字或符号,并在读取时首先意识到x
它没有得到它.如果它在这一点上推回都x
和e
?或者它应该只推回x
.
我想问的原因是将GNU的libc中的后续调用gets
返回ex
表明他们已经推后两x
和e
,但标准说:
除非规范包含n个指定符,否则从流中读取输入项.输入项目被定义为输入字符的最长序列,其不超过任何指定的字段宽度,并且是匹配输入序列的前缀或后缀[245]输入项目之后的第一个字符(如果有)仍然未读.如果输入项的长度为零,则指令的执行失败; 除非文件结束,编码错误或读取错误阻止了流的输入,否则此条件是匹配失败,在这种情况下,它是输入失败.
我将其解释为因为42e
匹配输入序列的前缀(因为例如42e1
将是匹配的输入序列),这应该意味着它将被42e
视为应该被读取的输入项而仅留下x
未读.如果流仅支持单个字符回退,那么实现起来也会更方便.
您对标准的解释是正确的.在C标准中甚至还有一个例子,它说不100ergs of energy
应该匹配,%f%20s of %20s
因为100e
无法匹配%f
.
但是大多数C库似乎都有不同的实现方式,可能是由于历史原因.我刚刚检查了macOS上的C库,它的行为类似于glibc.在相应的glibc的错误被封闭,WONTFIX与乌利齐·德雷珀如下解释:
这是ISO C委员会方面的愚蠢,这与现有做法背道而驰.任何更改都可能破坏现有代码.
归档时间: |
|
查看次数: |
104 次 |
最近记录: |