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”)。
我尝试了所有方法,但我无法仅将空白字符正确解析到输出缓冲区中。
问题:
sscanf(buffer, "%[^OK]", buffer);
尝试读取和写入同一个缓冲区。这是未定义的行为。使用不同的缓冲区。
"%[^OK]"
寻找所有 char
不是 'O'
也不是 'K'
,所以它在 \r\n+CIPRX ... DATA C
"%*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'
我需要像这样解析来自设备 (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(buffer, "%[^OK]", buffer);
尝试读取和写入同一个缓冲区。这是未定义的行为。使用不同的缓冲区。"%[^OK]"
寻找所有char
不是'O'
也不是'K'
,所以它在\r\n+CIPRX ... DATA C
"%*s"
insscanf("%*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'