3

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 */
        }

     }
}
4

7 に答える 7

4

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

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

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

于 2009-03-04T11:18:37.657 に答える
3
  1. 属性配列はどのように初期化されますか? NULL 要素が入り込んだ可能性があります。
  2. また、配列要素は NULL で終了する必要があります。
  3. strcmp() のより安全な代替手段として、strncmp()の使用を検討してください。
于 2009-03-04T11:19:28.810 に答える
1

このコードのコンテキストはエクスパット解析です-この投稿を参照してください。属性配列は名前と値が交互になっており、0が1つで終了します。

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

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

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

于 2009-03-04T11:37:56.393 に答える
1

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

于 2009-03-04T11:19:35.597 に答える
1

入力配列 ( attribute) は NULL で終了していますか? あなたはそれをリストしていませんが、コードはそれを必要とします。

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

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

于 2009-03-04T11:19:41.087 に答える
0

NULL のチェックを追加しますので、

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

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

于 2009-03-04T11:59:34.580 に答える
0

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

于 2009-03-04T11:21:47.773 に答える