%[^<] (和朋友)在格式化字符串系列中是什么意思?

What does %[^<] (and friends) mean in the formatted string family?

(可能应该作为答案提交)有代码

sscanf(string, "<title>%[^<]</title>", extracted_string);

运行 代码似乎将 <title> 标记之间的文本复制到 extracted_string,但我在 printf 系列中找不到任何对插入符号的引用,无论是在 man pages or elsewhere online

谁能给我指点一个资源,解释 %[^<]sscanf() 系列中其他类似语法的用法?

这意味着匹配任何不是 < 的东西,如果你的目标缓冲区可以容纳 100 个字符,那么在不指定最大目标缓冲区长度的情况下这样做并不是一个好主意,那么

char extracted_string[100];
sscanf(string, "<title>%99[^<]</title>", extracted_string);

会是更好的解决方案。

为此目的使用 strstr() 可以使 extracted_string 真正动态化。

来自 C11 标准文档,第 §7.21.6.2 章,第 12 段,转换说明符,(强调我的 )

[

Matches a nonempty sequence of characters from a set of expected characters (the scanset).

....

The conversion specifier includes all subsequent characters in the format string, up to and including the matching right bracket (]). The characters between the brackets (the scanlist) compose the scanset, unless the character after the left bracket is a circumflex (^), in which case the scanset contains all characters that do not appear in the scanlist between the circumflex and the right bracket.

A draft version of the standard, found online.

此 link 解释了 [ 和 ^ 在 scanf 函数族中的用法

(强调我的)

http://www.cdf.toronto.edu/~ajr/209/notes/printf.html


[

匹配指定的接受字符集中的非空字符序列;下一个指针必须是指向 char 的指针,并且必须有足够的空间容纳字符串中的所有字符,外加一个终止空字节。通常跳过前导白色 space 被抑制。该字符串由特定集合中(或不在)中的字符组成;该集合由开括号 [ 字符和闭括号 ] 字符之间的字符定义。 如果开括号后的第一个字符是抑扬符 (^),则集合将排除这些字符。要在集合中包含闭括号,请将其设为开括号后的第一个字符或旋律;任何其他位置都将结束该组。连字符 - 也很特殊;当放置在另外两个字符之间时,它会将所有中间字符添加到集合中。要包含连字符,请将其作为最后一个右括号之前的最后一个字符。例如,[^]0-9-] 表示集合 "everything except close bracket, zero through nine, and hyphen"。字符串以不在(或带有抑扬符,在)集合中的字符出现或字段宽度用完时结束。