【发布时间】:2014-02-20 14:43:49
【问题描述】:
我有一个 ASCII 字符串,格式为:
00001\x02This is a string\x030000100001\x021.0\x03\x021.0\x03\x021.0\x03\x021.0\x03001
在描述性方面,它是一个带有 5 位前导零整数的字符串,一个由 STX 和 ETX ASCII 字符封装的字符串,另外 2 个 5 位前导零整数,4 个由 STX 和 ETX ASCII 字符封装的浮点值由 3 位前导零整数。我正在尝试使用 sscanf 来解析字符串。它的行为不应该如此。我正在使用以下格式字符串:
"%5hu\x02%[0-9a-zA-Z _-]s\x03%5hu%05hu\x02%lf\x03\x02%lf\x03\x02%lf\x03\x02%lf\x03%3hhu"
我尝试将扫描集更改为不同的值,包括[^\x03]。我还尝试添加和删除长度说明符。我很确定这是导致问题的扫描集。我想知道 STX 和 ETX 字符文字是否有困难。任何人都知道为什么这不起作用?还是使用纯 C89 的更好选择?谢谢。
对于那些想要完整代码测试的人:
unsigned short one;
char two[32];
unsigned short three, four;
double five, six, seven, eight;
unsigned char nine;
char temp[] = "00001\x02This is a string\x03""0000100002\x02""1.1\x03\x02""2.2\x03\x02""3.3\x03\x02""4.5\x03""003";
sscanf(temp, "%5hu\x02%[-0-9a-zA-Z _]s\x03%5hu%05hu\x02%lf\x03\x02%lf\x03\x02%lf\x03\x02%lf\x03%3hhu",
&one, two, &three, &four, &five, &six, &seven, &eight, &nine);
【问题讨论】:
-
注意:八进制常量限制在反斜杠后最多 3 位,但十六进制常量不限于两个或三个十六进制数字,所以
\x0300000100001都是单个字符。我不确定这是否是您的问题的一部分。 -
另外,请注意扫描集是独立存在的;它不是
s转换说明符的限定符。您的格式字符串在扫描集匹配后的数据中查找实际的s。 -
已编辑以提供完整的代码示例。我知道十六进制转义问题。在上面的示例中,我将字符串分解以防止十六进制转义使用太多字符。我认为
s约定是可选的。我在没有它的情况下进行了测试,得到了相同的结果(或同样糟糕的结果)。 -
查看我的工作代码改编自您的原始格式字符串(通过删除 s 和拆分),以及与您的原始字符串等效的数据字符串(所有数字都是 1,而不是变化)。您没有显示来自
sscanf()的返回值的测试。例如,您的sscanf()是否存在无法识别%hhu的危险?它被添加到 C99 中,但例如,Microsoft 编译器是 C89 编译器,而不是 C99 编译器。你在哪个平台?您使用的是哪个 C 编译器?