【问题标题】:Is it possible to specify a string consisting of a number of `^` characters for scanf?是否可以为 scanf 指定一个由多个 `^` 字符组成的字符串?
【发布时间】:2021-06-29 10:24:19
【问题描述】:

在 C-scanf 格式中,如何指定我想要一个字符 ^

"%[^]" 不适用于 GNU scanf,因为^ 在开始时具有否定的含义。

【问题讨论】:

标签: c scanf


【解决方案1】:

scanf 是否可以指定由多个^ 字符组成的字符串?

做一个简单的%[^] 是不可能的。

%[^] 实际上是无效的——初始的[ 没有关闭。 %[^]] 被解释为除] 之外的所有字符。

假设%[^] 是有效的,那么它就会出现歧义:%[^]] 可以解释为仅由^ 后跟] 组成的字符串。或者想象像$[^]abc]。我相信扫描仅包含 ^ 的字符串的能力被牺牲了,以赋予 ^ 其功能,这是一个合理的牺牲。

实际解决问题,不要用scanf,自己写。或者您可以执行"%[\01^] 之类的操作 - 也可以扫描输入中不会包含的其他内容,例如0x01 byte。

来自C99 7.19.6.2(和this pdf)(强调我的):

[

[...]

转换说明符包括格式字符串中的所有后续字符,直到并包括匹配的右括号 (])。括号(扫描列表)之间的字符组成扫描集,除非左括号之后的字符是一个抑扬符(^),在这种情况下,扫描集包含所有未出现在抑扬符和右括号之间的扫描列表中的字符.如果转换说明符以[][^] 开头,则右括号字符在扫描列表中下一个右括号字符是匹配的右括号结束规范;否则后面的第一个右括号字符是结束规范的字符。 [...]

因此,如果转换为%[]%[^],则] 在扫描列表中,下一个] 将结束扫描列表。

作为一种解决方法,您可以在扫描列表中指定^ 否定除^ 之外的所有字符,仅有效扫描^ - %[^^]

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 2012-07-12
    • 1970-01-01
    • 2019-12-17
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多