質問
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 */
}
}
}
他のヒント
forループを終了するには、null文字列が必要です。
[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]
null
これがないと、forループは終了せず、strcmpを呼び出すときにガベージを指すattribute [i]になります。
- 属性配列はどのように初期化されますか? NULL要素が入り込んでいる可能性があります。
- また、配列要素はNULLで終わる必要があります。
- より安全な代替手段として strncmp()を使用することを検討できます。 strcmp()へ。
入力配列( attribute
)はNULLで終了しますか?存在するものとしてリストしませんが、コードはそれを必要とします。そうしないと、ランダムメモリに移動するだけです。
インデックスおよび/または比較される属性のプリントを挿入し、終了に関して期待どおりに動作するかどうかを確認します。
質問の文字列比較部分についてはわからない...入力にこれらの角括弧などが含まれている場合、各文字列の先頭を見ているため、何も見つかりません。その場合は、 strstr()
を試してください。部分文字列が見つかります。
ロギングを追加し、途中ですべての属性とインデクサー値をダンプします。これは、何が問題なのかを特定するのに役立ちます。
nullで終了しないことに加えて、strncmp()を使用しないのはなぜですか? :)
NULLのチェックを追加すると、次のようになります
if(attribute[1] != NULL && strcmp("frametype", attribute[1]) == 0)
したがって、NULLポインターを逆参照していません。
所属していません StackOverflow