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

时间:2015-05-18 13:44:58

标签: c string-formatting scanf

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

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

运行代码似乎会将<title>代码之间的文本复制到extracted_string,但我无法在man pageselsewhere online或{中找到printf系列中对插入符号的任何引用{3}}。

有人可以在%[^<]系列中向我指出解释sscanf()及其他类似语法使用情况的资源吗?

3 个答案:

答案 0 :(得分:5)

test1.pl标准文件,章节§7.21.6.2,第12段,转换说明符,(强调我的

  

[

     

匹配一组预期字符的非空字符序列   (扫描组)。

     

....

     

转换说明符包括格式中的所有后续字符   字符串,包括匹配的右括号(C11)。那些角色   括号之间(扫描列表)组成扫描集,除非是字符   在左括号之后是一个回旋(]),在这种情况下,扫描集包含在回旋和回旋之间的扫描列表中没有出现的所有字符   右括号。

A draft version of the standard, found online

答案 1 :(得分:2)

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

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

将是一个更好的解决方案。

为此目的使用strstr(),您可以实际使extracted_string动态化。

答案 2 :(得分:1)

此链接解释了scanf系列函数中的[和^用法

(强调我的)

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

[

匹配指定的接受字符集中的非空字符序列;下一个指针必须是指向char的指针,并且字符串中的所有字符必须有足够的空间,加上一个终止空字节。通常跳过前导空格被抑制。该字符串由特定集合中的字符组成(或不在其中);该集合由open括号[character和close bracket]字符之间的字符定义。 如果开括号后面的第一个字符是旋转符号(^),则该集合将排除这些字符。要在集合中包含一个近括号,请将其作为开括号或抑扬符后的第一个字符;任何其他位置将结束该集。连字符 - 也很特别;当放置在两个其他字符之间时,它会将所有插入的字符添加到集合中。要包含连字符,请将其设置为最后一个关闭括号之前的最后一个字符。例如,[^] 0-9-]表示除了小括号,0到9和连字符&#34;之外的所有内容。该字符串的结尾是字符的外观不在(或带有旋律,in)设置或字段宽度用完时。