C++ 带空格的sscanf解析响应
我需要解析来自设备(SIM900)的响应,如下所示: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,
\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'