Pergunta
Compilar com gcc C99
Eu estou tentando comparar 2 string usando String de comparação. No entanto, parece-me estar recebendo um despejo de pilha na linha strcmp.
atributo ** conterá estes, por isso estou procurando frametype.
[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]
É este o caminho correcto comparar.
Muito obrigado por todas as sugestões,
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 */
}
}
}
Solução
O contexto deste código é a análise expatriados - veja este post . Os atributos matriz é alternada nome e o valor, com um único 0 a terminar.
A menos que você está procurando qualquer atributo cujo nome ou o valor é igual a sua seqüência de teste (o que seria um tanto incomum), em seguida, seu código deve incrementar i por 2 em vez de 1 - para que ele pisa sobre um nome e um valor.
Você deve estar comparando qualquer atributo [i] para coincidir com um nome, ou ou atributo [i + 1] para corresponder a um valor.
Não presuma que os atributos vai estar em qualquer ordem particular. Atualmente você está apenas olhando para atributo 1 , que é o valor do primeiro atributo retornado. Se houver mais de um atributo, eles podem ser devolvidos em qualquer ordem.
Outras dicas
Você precisa ter uma seqüência nula, a fim de encerrar o loop for:
[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]
null
Sem esse o loop não será encerrado e você vai acabar com o atributo [i] apontando para o lixo quando você chamar strcmp.
- Como é a matriz de atributo inicializado? Um elemento NULL pode ter deslizado em.
- Além disso, o elemento de matriz tem de terminar com um NULL.
- Você pode considerar o uso strncmp () como uma alternativa mais segura a strcmp ().
O seu matriz de entrada (attribute
) NULL-terminado? Você não listá-lo como sendo, mas o código requer que caso contrário ele vai simplesmente caminhar ao longo na memória aleatório, que é um bom motivo de segfaults.
Inserir uma cópia do índice e / ou o atributo que estão sendo comparados, para ver se ele se comporta da maneira esperada em relação à rescisão.
Não tão certo sobre a parte string de comparação da pergunta ... Se a entrada contém os colchetes e assim por diante, você nunca vai encontrar qualquer coisa desde que você está olhando para o início de cada corda. Tente strstr()
se for esse o caso, ele encontra substrings.
Adicionar um registro e despejar todos os atributos e o valor indexador ao longo do caminho. Isso vai ajudar a identificar o que está errado.
Não Além de ser terminada nula, por que não usar strncmp ()? :)
Gostaria de acrescentar um cheque de NULL para que você tenha
if(attribute[1] != NULL && strcmp("frametype", attribute[1]) == 0)
Então você não está dereferencing um ponteiro NULL.