Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带空格的sscanf解析响应_C++_Scanf_Sim900 - Fatal编程技术网

C++ 带空格的sscanf解析响应

C++ 带空格的sscanf解析响应,c++,scanf,sim900,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,

我需要解析来自设备(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”)

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

问题:

  • sscanf(缓冲区“%[^OK]”,缓冲区)尝试读取和写入同一缓冲区。这是未定义的行为。使用不同的缓冲区

  • “%[^OK]”
    查找所有不是
    'O'
    且不是
    'K'
    字符,因此它在
    \r\n+CIPRX>处停止。。。数据C

  • “%*s”
    sscanf(“%*s,%d…”)中执行两项操作1)扫描并不保存所有前导空格字符。2) 扫描而不保存(因为
    “*”
    )所有非空白字符。“所有非空白字符”后面永远不会有“
    ”,“
    ”,因此
    sccanf()
    停止

  • 当使用
    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;
    }
    

    您应该检查sscanf的返回值,以便更好地了解出了什么问题。请您更清楚地说明您现在得到的是什么输出以及您想要什么。C11标准草案,
    7.21.6.7 sscanf函数,第2节[…]如果复制发生在重叠的对象之间,则行为未定义。
    now i'm getting“”,where and are\r\n。我只想获得beetween s的空格。@EOF我尝试使用不同的缓冲区,得到了相同的结果。你不明白undefined的哪一部分?您是否“获得了相同的结果”无关紧要。在程序没有表现出未定义的行为之前,您无法对其进行推理。
    bytesRead:1
    bytesToRead:3
    data:'DATA COMPOSED BY A WHITESPACE AND MAYBE OTHER'