2009-03-04 19 views
2

gccでコンパイルするC99strcmpを使って比較する

文字列比較を使用して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 */ 
     } 

    } 
} 

答えて

1

このコードのコンテキストは、expat解析中です - see this postです。属性配列は名前と値が交互になり、終了する単一の0が付いています。

名前または値がテスト文字列(これはやや珍しい)を持つ属性を探しているのでなければ、コードでは1よりも2だけiを増やす必要があります。と値。

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

属性が特定の順序になるとは限りません。現在、返される最初の属性の値である属性1しか見ていません。複数の属性がある場合、それらは任意の順序で返すことができます。あなたはあなたがNULLポインタを参照解除されていません

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

を持っているので、

4

あなたはforループを終了するために、null文字列を持っている必要があります。これがないと

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

をループするために終了しませんstrcmpを呼び出すと属性[i]がゴミを指してしまうでしょう。

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

このコードをstrncmp()を使用するように変更した場合、「n」には何を渡しますか?この状況でこれはどのように役立ちますか? – bk1e

+0

私は9(フレームタイプ+1の長さ)を使用します。問題がNULLと比較し始めているので、おそらくこの状況では役に立たないでしょう。 –

1

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

1

入力配列(attribute)はNULLで終端されていますか?あなたはそれを存在としてリストアップしていませんが、コードではそれを必要とします。そうでなければ、セグメンテーションの良い原因であるランダムなメモリに移動します。

比較対象のインデックスおよび/または属性の印刷を挿入して、それが終了に関して予想どおりに動作するかどうかを確認します。

質問の文字列比較部分についてはあまり確かではありません。入力に角かっこなどが含まれていると、各文字列の先頭を見ているので、何も見つかりません。その場合は、部分文字列を検索してstrstr()を試してください。

0

strncmp()を使用しないでください。 :)

0

は私がNULLのチェックを追加します。

関連する問題