Frage

mit gcc C99 Kompilieren

Ich versuche, 2 Zeichenfolge zu vergleichen Zeichenfolge mit vergleichen. Allerdings scheinen ich einen Stack Dump auf der strcmp Linie zu bekommen.

** Attribut enthalten diese, so dass ich für Frame-Type suchen.

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

Ist die richtige Art und Weise zu vergleichen.

Vielen Dank für Ihre Anregungen,

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

     }
}
War es hilfreich?

Lösung

Der Kontext dieses Codes ist Expat-Parsing - diesen Beitrag sehen . Die Attribute Array wird abwechselnder Namen und den Wert, mit einer einzigen 0 zu beenden.

Wenn Sie nicht gerade für jedes Attribut, dessen Namen oder Wert suchen, ist gleich Ihren Test-String (was etwas ungewöhnlich wäre), dann wird Ihr Code soll mich eher um 2 erhöhen als 1 -, so dass sie die Schritte sowohl über einen Namen und ein Wert.

Sie sollten den Vergleich entweder Attribut [i] einen Namen übereinstimmen, oder oder ein Attribut [i + 1] einen Wert entsprechen.

Nehmen Sie nicht an, dass die Attribute in einer bestimmten Reihenfolge sein werden. Derzeit sind Sie nur Attribut suchen 1 , was der Wert ist des ersten Attributs zurück. Wenn es mehr als ein Attribut ist, können sie in beliebiger Reihenfolge zurückgegeben werden.

Andere Tipps

Sie erhalten eine leere Zeichenfolge zu haben, um brauchen, um zu beenden, die for-Schleife:

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

Ohne dies die for-Schleife wird nicht enden, und Sie werden mit dem Attribut am Ende [i] zeigt auf Müll, wenn Sie strcmp nennen.

  1. Wie wird das Attribut Array initialisiert? Ein NULL-Element hat schlüpft in.
  2. Außerdem muss das Array-Element mit einem NULL beenden.
  3. Sie können prüfen, mit strncmp () als sicherere Alternative strcmp ().

Ist Ihre Eingabe-Array (attribute) NULL-terminiert? Sie Liste nicht als zu sein, aber der Code erfordert es sonst wird es nur entlang in gelegentliches Gedächtnis gehen, was eine gute Sache der segfaults ist.

Legen Sie einen Druck des Index und / oder das Attribut verglichen werden, um zu sehen, ob es die Art und Weise verhält man in Bezug auf Kündigung rechnen.

Nicht so sicher über den String-Vergleich Teil der Frage ... Wenn die Eingabe diese eckigen Klammern enthält und so weiter, werden Sie nicht immer etwas finden, da Sie zu Beginn jeder Saite suchen. Versuchen Sie strstr() wenn das der Fall ist, findet es Substrings.

In Protokollierung und Dump alle Attribute und den Indexer Wert auf dem Weg. Dies wird helfen, herauszufinden, was falsch läuft.

Darüber hinaus nicht null beendet wird, warum verwenden strncmp nicht ()? :)

Ich würde einen Scheck für NULL hinzufügen, damit Sie haben

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

Sie sind also ein NULL-Zeiger nicht dereferencing.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top