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

     }
}
Foi útil?

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.

  1. Como é a matriz de atributo inicializado? Um elemento NULL pode ter deslizado em.
  2. Além disso, o elemento de matriz tem de terminar com um NULL.
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top