C语言 fscanf/scanf/sscanf转换规范抑制赋值不是转换吗?



sscanf("x", "%*c%c", &(char){0})应该返回什么?

Apple和Godbolt使用的库返回−1,这是他们的EOF。然而,C 2018 7.21.6.7 3告诉我们,如果在第一次转换(如果有的话)完成之前发生输入失败,sscanf返回"EOF"。%*c是一个禁止赋值的转换规范。它完成,然后在%c完成之前发生输入失败(字符串结束)。那么sscanf应该返回"分配的输入项数",即0。

标准中是否有任何文本告诉我们%*c不被视为转换?

显然C99§7.19.6.2第15点(和C17§7.21.6.2第15点)告诉我们:

尾随空格(包括换行字符)不被读取,除非匹配指令。字面值匹配和抑制赋值的成功与否不是直接的可通过%n指令以外的方式确定。

Where"抑制赋值";定义为%*后跟一个说明符。

所以你在你的例子中看到的似乎符合标准:你不能推断%*c是否匹配,除非你使用n说明符来计算扫描字符的数量。

另外,user3386109的注释指出"返回值只与赋值的数量有关"。问题中引用的C标准文本可能是想说"第一次作业";而不是"第一次转换"。

最新更新