A comment(可能应该作为答案提交)有代码
sscanf(string, "<title>%[^<]</title>", extracted_string);
运行代码似乎会将<title>
代码之间的文本复制到extracted_string
,但我无法在man pages或elsewhere online或{中找到printf系列中对插入符号的任何引用{3}}。
有人可以在%[^<]
系列中向我指出解释sscanf()
及其他类似语法使用情况的资源吗?
答案 0 :(得分:5)
从test1.pl
标准文件,章节§7.21.6.2,第12段,转换说明符,(强调我的)
[
匹配一组预期字符的非空字符序列 (扫描组)。
....
转换说明符包括格式中的所有后续字符 字符串,包括匹配的右括号(
C11
)。那些角色 括号之间(扫描列表)组成扫描集,除非是字符 在左括号之后是一个回旋(]
),在这种情况下,扫描集包含在回旋和回旋之间的扫描列表中没有出现的所有字符 右括号。
答案 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)设置或字段宽度用完时。