我有一个用C编写的应用程序,它使用AT命令从调制解调器读取文本消息。调制解调器的典型AT响应如下所示:
+CMGL: 1,"REC READ","+31612123738",,"08/12/22,11:37:52+04"
代码当前设置为仅从此行检索id,这是第一个数字,并使用以下代码执行此操作:
sscanf(line, "+CMGL: %d,", &entry);
这里,“line”是包含来自调制解调器的行的字符数组,“entry”是存储id的整数。我尝试像这样扩展这段代码:
sscanf(line, "+CMGL: %d,\"%*s\",\"%s\",", &entry, phonenr);
我想我会使用%* s扫描第一对引号中的文本并跳过它,然后将下一对引号(电话号码)中的文本读入phonenr字符数组。
这不起作用(%* s显然读取“REC”,下一个%s不读取任何内容)。
一个额外的挑战是文本不限于“REC READ”,它实际上可能是很多东西,也是一个没有空间的文本。
答案 0 :(得分:1)
Sscanf不是很适合解析,而是使用strchr。没有错误处理:
#include <stdio.h>
int main(void)
{
const char *CGML_text = "+CMGL: 1,\"REC READ\",\"+31612123738\",,\"08/12/22,11:37:52+04\"";
char *comma, *phone_number_start, *phone_number_end;
comma = strchr(CGML_text, ',');
comma = strchr(comma + 1, ',');
phone_number_start = comma + 2;
phone_number_end = strchr(phone_number_start, '"') - 1;
printf("Phone number is '%.*s'\n", phone_number_end + 1 - phone_number_start, phone_number_start);
return 0;
}
(使用经过测试的工作代码更新)
答案 1 :(得分:1)
我现在解决它的方法是使用以下代码:
sscanf(line, "+CMGL: %d,\"%*[^\"]\",\"%[^\"]", &entry, phonenr);
这将首先扫描一个数字(%d),然后扫描不是双引号的任意字符串(并跳过它们,因为星号),对于电话号码,它会做同样的事情。
但是,我不确定这是多么强大。
答案 2 :(得分:0)
您可以使用strchr()在字符串中查找“+”的位置,然后在其后面提取电话号码。您也可以尝试使用strtok()将字符串拆分为“”,并分析第3部分。
答案 3 :(得分:0)
%s读取直到空格。
你非常接近解决方案。
阅读本文;
+ CMGL:1,“REC READ”
你需要;
“+ CMGL:%d,”%* s%* s“