【发布时间】:2017-08-18 11:11:34
【问题描述】:
我正在尝试从字符串中提取两个值。第一个是 8 位十六进制值,第二个是无符号 1-4 位值。这些值之前还应该有一个命令,该命令告诉程序如何处理这些值,在本例中为“读取”。格式的一些示例:
"read 0x1234ABCD 2000"
"read 0x00000001 10"
我想同时提取两个值并确认格式,并且有以下代码行:
uint addr;
uint len;
int n = sscanf(str, "read 0x%x[0-9a-fA-F]{8} %u[0-9]{1,4}", &addr, &len);
if (n != 2){
// Wrong format...
}
十六进制值读取正确,但第二个值未正确读取,n 始终为 1。我做错了什么?
【问题讨论】:
-
scanfnot 做正则表达式。要读取最多八个十六进制数字,只需使用"%8x"。参见例如thisscanf(and family) reference. -
@Someprogrammerdude。嗯,我打算回答这个问题(stackoverflow.com/questions/16013031/…)。那不是正则表达式吗?
-
假设你的意思是例如
"%[0-9]",那么不,它不是正则表达式,而是使用 simple 字符类的变体。 -
好的,我在 sscanf "read 0x%8x %u" 中尝试了以下操作,效果很好。谢谢!
-
@AndrewHenle 同意
scanf()可能是一个挑战,但更大的挑战,IMO,是语法要求从一开始就不完整:只提供 一些 可接受的形式和一些不可接受的形式。当原始目标不精确时,任何解决方案都容易出现维护问题。