Question

compilation avec gcc C99

J'essaie de comparer 2 chaînes à l'aide de chaînes de comparaison. Cependant, il semble que je reçois un dump de pile sur la ligne strcmp.

** L'attribut contiendra ces éléments, je recherche donc frametype.

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

Cette comparaison est-elle correcte?

Merci beaucoup pour vos suggestions,

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

     }
}
Était-ce utile?

La solution

Le contexte de ce code est l'analyse des expats - voir cet article . Le tableau d'attributs est un nom et une valeur en alternance, avec un seul 0 pour terminer.

À moins que vous ne recherchiez un attribut dont le nom ou la valeur est égal à votre chaîne de test (ce qui serait quelque peu inhabituel), votre code doit incrémenter i de 2 au lieu de 1 - de sorte qu'il passe au-dessus d'un nom et une valeur.

Vous devriez comparer soit l'attribut [i] pour correspondre à un nom, soit l'attribut [i + 1] pour correspondre à une valeur.

Ne supposez pas que les attributs seront dans un ordre particulier. Actuellement, vous ne regardez que l'attribut 1 , qui correspond à la valeur du premier attribut retourné. S'il existe plusieurs attributs, ils peuvent être renvoyés dans n'importe quel ordre.

Autres conseils

Vous aurez besoin d'une chaîne null pour terminer la boucle for:

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

Sans cela, la boucle for ne se terminera pas et vous obtiendrez l'attribut [i] pointant vers garbage lorsque vous appelez strcmp.

  1. Comment le tableau d'attributs est-il initialisé? Un élément NULL peut être entré.
  2. De plus, l'élément de tableau doit se terminer par NULL.
  3. Vous pouvez envisager d'utiliser strncmp () comme alternative plus sûre strcmp ().

Votre tableau d'entrée ( attribut ) est-il terminé par NULL? Vous ne le listez pas comme tel, mais le code le requiert, sinon il ira simplement en mémoire aléatoire, ce qui est une bonne cause de segfaults.

Insérez une impression de l'index et / ou de l'attribut comparé pour voir s'il se comporte comme prévu en ce qui concerne la résiliation.

Je ne suis pas sûr de la question de la comparaison de chaînes de la question ... Si l'entrée contient ces crochets, etc., vous ne trouverez jamais rien puisque vous regardez le début de chaque chaîne. Essayez strstr () si c'est le cas, il trouve des sous-chaînes.

Ajoutez une journalisation et videz tous les attributs et la valeur de l'indexeur en cours de route. Cela aidera à identifier ce qui ne va pas.

Au-delà de l’absence de nullité, pourquoi ne pas utiliser strncmp ()? :)

Je voudrais ajouter un contrôle pour NULL afin que vous ayez

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

Ainsi, vous ne déréférencerez pas un pointeur NULL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top