sscanf 解析带有空格的响应

sscanf parse response with whitespaces

我需要像这样解析来自设备 (SIM900) 的响应:

\r\n+CIPRXGET:1

+CIPRXGET: 2,1,3
DATA COMPOSED BY A WHITESPACE AND MAYBE OTHER
OK

所以我使用了 sscanf 两次:第一次是删除最后的字符串 "OK",第二次是解析数据。

char buffer[256] = sim900.getResponse();
char data[256];
int bytesRead, bytesToRead;
sscanf(buffer, "%[^OK]", buffer);
sscanf(buffer, "%*s,%d,%d\r\n%[^\0]", &bytesRead, &bytesToRead, data);

我的响应以空格(字符 0x20)开头,我得到了一个脏输出,即“\r\n \r\n”(或十六进制表示形式“0x0D 0x0A 0x20 0x0D 0x0A”)。

我尝试了所有方法,但我无法仅将空白字符正确解析到输出缓冲区中。

问题:

  1. sscanf(buffer, "%[^OK]", buffer); 尝试读取和写入同一个缓冲区。这是未定义的行为。使用不同的缓冲区。

  2. "%[^OK]" 寻找所有 char 不是 'O' 也不是 'K',所以它在 \r\n+CIPRX ... DATA C

  3. "%*s" in sscanf("%*s,%d..." 做了 2 件事 1) 扫描而不保存所有前导的白色-space 字符。 2) 扫描而不保存(因为'*')所有非白色-space字符。 "all non-white-space characters" 之后永远不会有 ',',所以 sccanf() 停止。

当使用 sscanf() 并遇到问题时,编码的第一件事是检查 sscanf() 的 return 值。

不清楚 OP 的总体目标,但以下内容可能会有所帮助。

#include <stdio.h>

char *text = 
"\r\n+CIPRXGET:1\r\n+CIPRXGET: 2,1,3\r\nDATA COMPOSED BY A WHITESPACE AND MAYBE OTHER\r\nOK";

int main(void) {
  char data[256];
  int bytesRead, bytesToRead;
  if (sscanf(text, "%*[^,],%d,%d %255[^\r\n]", &bytesRead, &bytesToRead, data) == 3) {
    printf("bytesRead:%d\nbytesToRead:%d\ndata:'%s'\n",bytesRead, bytesToRead, data);
  }
  return 0;
}

输出

bytesRead:1
bytesToRead:3
data:'DATA COMPOSED BY A WHITESPACE AND MAYBE OTHER'