c - sscanf 中带有字符串定界符的扫描集

标签 c parsing format scanf

我有一个如下形式的 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 字 rune 字是否遇到困难。任何人都知道为什么这不起作用?还是使用纯 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);

最佳答案

我无法立即明白为什么它不起作用,但我会把它分解成一个字符串并让它变得越来越长,直到它失败。

就我个人而言,我会使用 strtok(在 STX 和 ETX 封装的边界上)解析它,然后使用 scanf 读取特定的 float 和整数。

关于c - sscanf 中带有字符串定界符的扫描集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21911096/

相关文章:

json - 如何在 Notepad++ 中重新格式化 JSON?

html - 不显示全 Angular div

c - 解决复合分配中的转换警告

c - 为什么我们不能将值赋给char指针的字符串?

c++ - 使用 Boost Spirit 解析语法

java - 设置可编辑文本区域的格式

c# - 在 C# 中为 double 添加千位分隔符

c++ - 在 gdb 中使用 coredump 时,我如何确切知道哪个线程导致了 SIGSEGV?

c - 在c中对二维数组进行排序

php - 如何防止 PHP DOMDocument 来自 "fixing"您的 HTML 字符串