質問

gcc C99でコンパイル

文字列比較を使用して2つの文字列を比較しようとしています。 ただし、strcmp行でスタックダンプを取得しているようです。

**属性にはこれらが含まれるので、フレームタイプを探しています。

[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]

これは比較する正しい方法です。

ご提案ありがとうございます

void g_start_element(void *data, const char *element, const char **attribute)
{
    for(i = 0; attribute[i]; i++)
    {
    /* Only interested in the frametype */
        if(strcmp(attribute[i], "frametype") == 0)
        {
            /* do some work here */
        }

     }
}
役に立ちましたか?

解決

このコードのコンテキストはexpat解析です-この投稿を見る。属性配列は、名前と値が交互になっており、単一の0で終了します。

名前または値がテスト文字列に等しい属性を探している場合を除き(これはやや珍しいことです)、コードはiを1ではなく2ずつインクリメントする必要があります。値。

名前と一致するにはattribute [i]を、値と一致するにはattribute [i + 1]を比較する必要があります。

属性が特定の順序であると仮定しないでください。現在、属性 1 のみを参照しています。これは値です返される最初の属性の。複数の属性がある場合、それらは任意の順序で返されます。

他のヒント

forループを終了するには、null文字列が必要です。

[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]
null

これがないと、forループは終了せず、strcmpを呼び出すときにガベージを指すattribute [i]になります。

  1. 属性配列はどのように初期化されますか? NULL要素が入り込んでいる可能性があります。
  2. また、配列要素はNULLで終わる必要があります。
  3. より安全な代替手段として strncmp()を使用することを検討できます。 strcmp()へ。

入力配列( attribute )はNULLで終了しますか?存在するものとしてリストしませんが、コードはそれを必要とします。そうしないと、ランダムメモリに移動するだけです。

インデックスおよび/または比較される属性のプリントを挿入し、終了に関して期待どおりに動作するかどうかを確認します。

質問の文字列比較部分についてはわからない...入力にこれらの角括弧などが含まれている場合、各文字列の先頭を見ているため、何も見つかりません。その場合は、 strstr()を試してください。部分文字列が見つかります。

ロギングを追加し、途中ですべての属性とインデクサー値をダンプします。これは、何が問題なのかを特定するのに役立ちます。

nullで終了しないことに加えて、strncmp()を使用しないのはなぜですか? :)

NULLのチェックを追加すると、次のようになります

if(attribute[1] != NULL && strcmp("frametype", attribute[1]) == 0)

したがって、NULLポインターを逆参照していません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top