【发布时间】:2021-06-29 10:24:19
【问题描述】:
在 C-scanf 格式中,如何指定我想要一个字符 ^?
"%[^]" 不适用于 GNU scanf,因为^ 在开始时具有否定的含义。
【问题讨论】:
在 C-scanf 格式中,如何指定我想要一个字符 ^?
"%[^]" 不适用于 GNU scanf,因为^ 在开始时具有否定的含义。
【问题讨论】:
scanf 是否可以指定由多个
^字符组成的字符串?
做一个简单的%[^] 是不可能的。
%[^] 实际上是无效的——初始的[ 没有关闭。 %[^]] 被解释为除] 之外的所有字符。
假设%[^] 是有效的,那么它就会出现歧义:%[^]] 可以解释为仅由^ 后跟] 组成的字符串。或者想象像$[^]abc]。我相信扫描仅包含 ^ 的字符串的能力被牺牲了,以赋予 ^ 其功能,这是一个合理的牺牲。
实际解决问题,不要用scanf,自己写。或者您可以执行"%[\01^] 之类的操作 - 也可以扫描输入中不会包含的其他内容,例如0x01 byte。
来自C99 7.19.6.2(和this pdf)(强调我的):
[[...]
转换说明符包括格式字符串中的所有后续字符,直到并包括匹配的右括号 (
])。括号(扫描列表)之间的字符组成扫描集,除非左括号之后的字符是一个抑扬符(^),在这种情况下,扫描集包含所有未出现在抑扬符和右括号之间的扫描列表中的字符.如果转换说明符以[]或[^]开头,则右括号字符在扫描列表中,下一个右括号字符是匹配的右括号结束规范;否则后面的第一个右括号字符是结束规范的字符。 [...]
因此,如果转换为%[] 或%[^],则] 在扫描列表中,下一个] 将结束扫描列表。
作为一种解决方法,您可以在扫描列表中指定^ 否定除^ 之外的所有字符,仅有效扫描^ - %[^^]。
【讨论】: