0

我有一个用 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”,它实际上可以是很多东西,也可以是没有空格的文本。

4

4 回答 4

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;
}

(更新了经过测试的工作代码)

于 2009-08-21T12:33:16.167 回答
1

我现在解决它的方法是使用以下代码:

sscanf(line, "+CMGL: %d,\"%*[^\"]\",\"%[^\"]", &entry, phonenr);

这将首先扫描一个数字 (%d),然后是一个非双引号的任意字符串(并跳过它们,因为星号),对于电话号码也是如此。

但是,我还不确定这有多强大。

于 2009-08-21T12:41:09.540 回答
0

您可以使用 strchr() 查找字符串中“+”的位置,并提取其后的电话号码。您也可以尝试使用 strtok() 将字符串与 '"' 分开,并分析第 3 部分。

于 2009-08-21T12:28:33.090 回答
0

scanf() 中的 %s 一直读取到空格。

您非常接近解决方案。

阅读本文;

+CMGL:1,“记录读取”

你需要;

"+CMGL: %d,"%*s %*s"

于 2009-08-21T12:33:22.607 回答