【发布时间】:2021-04-30 16:12:20
【问题描述】:
我有字符串"pid:8792 byr:2000 cols:hkjdp\n",我只想提取byr: 之后的数字。我认为可以通过使用sscanf(str,"byr:%d",&number); 提取格式化字符串来完成。但不幸的是,您不能这样做,因为在数字之前和之后还有其他字符,所以我看到您可以使用某种正则表达式,就像在这个问题中提出的 How to use regex in sscanf
所以我尝试了这样的事情:sscanf(passport, "%*[^byr:]:%[^\h]%*[^\n]", byr); 其中 byr 现在定义为 char *byr;。但是你不能使用像\hfor whitespace 这样的正则表达式。
长话短说:有什么方法可以让我使用sscanf 解析许多字符串,并始终在byr: 之后提取该数字,我在哪里可以找到所有这些字符在格式化字符串中使用的备忘单? (当然我知道显而易见的%f %d %s %c等等,但这些在这种情况下并没有真正发挥作用。
【问题讨论】:
-
也许你需要一个合适的正则表达式库?
-
或者只是使用其他方式?如
strstr后跟strtoul -
您可以使用
sscanf和"pid:%*d byr:%d cols:%*s"之类的格式。像这样的 scanf 格式字符串中的*表示“扫描,但不分配给任何东西”。 -
但是不,
scanf没有也不能做真正的正则表达式,正如that other question 解释的那样。 -
man scanf包含scanf转换规范的完整描述。你不会在那里找到正则表达式,因为 scanf 不做正则表达式。在 C 语言中,像\n这样的转义序列在实际执行像scanf这样的函数之前很久就被编译器转换为相应的字符。在 scanf 格式字符串中,空白字符的处理方式相同,如man scanf中所述;它们匹配输入中的任何空白字符序列。 (在大多数正则表达式库中,空格是\s,而不是\h。但它们都不是有效的 C 转义序列。)