0

AT コマンドを使用してモデムからテキスト メッセージを読み取る C で書かれたアプリケーションがあります。モデムからの典型的な 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、 "REC READ"

必要です。

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

于 2009-08-21T12:33:22.607 に答える