sscanf使用空格解析响应
sscanf parse response with whitespaces
我需要解析来自设备(SIM900)的响应,如下所示:
rn+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,%drn%[^\0]", &bytesRead, &bytesToRead, data);
我的响应以空白(字符0x20)开始,得到一个脏输出,即"\r\n\r\n"(或十六进制表示为"0x0D 0x0A 0x20 0x0D 0x0A")。
我尝试了所有的方法,但我不能只正确地将空白字符解析到输出缓冲区中。
问题:
-
CCD_ 1尝试对同一缓冲区进行读取和写入。这是未定义的行为。使用不同的缓冲区@EOF-
-
"%[^OK]"
查找所有不是'O'
也不是'K'
的char
,因此它在rn+CIPRX ... DATA C
处停止 -
sscanf("%*s,%d..."
中的"%*s"
做两件事:1)扫描并且不保存所有前导空白字符。2) 扫描而不保存(由于'*'
)所有非空白字符。"所有非空白字符"后面永远不会有sscanf(buffer, "%[^OK]", buffer);
0,因此sccanf()
停止。
当使用sscanf()
并出现故障时,首先要进行编码的是检查sscanf()
的返回值。
目前还不清楚OP的总体目标,但以下内容可能会有所帮助。
#include <stdio.h>
char *text =
"rn+CIPRXGET:1rn+CIPRXGET: 2,1,3rnDATA COMPOSED BY A WHITESPACE AND MAYBE OTHERrnOK";
int main(void) {
char data[256];
int bytesRead, bytesToRead;
if (sscanf(text, "%*[^,],%d,%d %255[^rn]", &bytesRead, &bytesToRead, data) == 3) {
printf("bytesRead:%dnbytesToRead:%dndata:'%s'n",bytesRead, bytesToRead, data);
}
return 0;
}
输出
bytesRead:1
bytesToRead:3
data:'DATA COMPOSED BY A WHITESPACE AND MAYBE OTHER'
相关文章:
- 2D数组来自文本输入,中间有空格
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 如何在c++中使用system()来运行包含空格的python脚本
- basic_string的前导/尾部不区分空格的特征
- 移除前面有空格的前2个字符串
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 在字符串中插入空格
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- C++为一串单词添加空格
- 使用另一个字符串从字符串中删除空格
- C++ 信号和插槽不工作:插槽不响应事件
- NodeJs 服务器充斥着 UDP 广播,不发送响应
- 我还可以添加什么来按空格或空格正确拆分C++字符串?
- sscanf使用空格解析响应