sscanf使用空格解析响应

时间:2015-12-16 16:44:44

标签: c++ scanf sim900

我需要解析来自设备(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 个答案:

答案 0 :(得分:0)

问题:

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

  2. "%[^OK]"查找不是char且不是'O'的所有'K',因此它会停在\r\n+CIPRX ... DATA C

    < / LI> "%*s"中的
  3. sscanf("%*s,%d..."执行了2项操作1)扫描而不保存所有前导空白字符。 2)扫描而不是保存(因为'*')所有非空白字符。永远不会有','跟随“所有非空白字符”,因此sccanf()会停止。

  4. 使用sscanf()并遇到麻烦时,首先要做的是检查sscanf()的返回值。

    不清楚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'