Domanda

compilazione con gcc C99

Sto cercando di confrontare 2 stringhe usando il confronto delle stringhe. Tuttavia, sembra che stia ottenendo un dump dello stack sulla riga strcmp.

L'attributo

** conterrà questi, quindi sto cercando frametype.

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

È questo il modo corretto di confrontare.

Mille grazie per eventuali suggerimenti,

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

     }
}
È stato utile?

Soluzione

Il contesto di questo codice sta analizzando gli expat - vedi questo post . La matrice di attributi alterna nome e valore, con un singolo 0 da terminare.

A meno che tu non stia cercando un attributo il cui nome o valore sia uguale alla tua stringa di test (il che sarebbe in qualche modo insolito), il tuo codice dovrebbe incrementare i di 2 anziché 1 - in modo che passi sopra un nome e un valore.

Dovresti confrontare l'attributo [i] per abbinare un nome o l'attributo [i + 1] per abbinare un valore.

Non dare per scontato che gli attributi siano in un ordine particolare. Attualmente stai guardando solo l'attributo 1 , che è il valore del primo attributo restituito. Se sono presenti più attributi, possono essere restituiti in qualsiasi ordine.

Altri suggerimenti

Devi avere una stringa nulla per terminare il ciclo for:

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

Senza questo il ciclo for non terminerà e finirai con l'attributo [i] che punta a garbage quando chiami strcmp.

  1. Come viene inizializzato l'array di attributi? Un elemento NULL potrebbe essere entrato.
  2. Inoltre, l'elemento array deve terminare con un NULL.
  3. Puoi considerare l'utilizzo di strncmp () come alternativa più sicura a strcmp ().

L'array di input ( attributo ) è NULL? Non lo elenchi come tale, ma il codice lo richiede altrimenti andrà semplicemente nella memoria casuale, che è una buona causa di segfault.

Inserisci una stampa dell'indice e / o dell'attributo che viene confrontato, per vedere se si comporta come ti aspetti rispetto alla risoluzione.

Non sono così sicuro della parte di confronto delle stringhe della domanda ... Se l'input contiene quelle parentesi quadre e così via, non troverai mai nulla poiché stai osservando l'inizio di ogni stringa. Prova strstr () se è così, trova sottostringhe.

Aggiungi la registrazione e scarica tutti gli attributi e il valore dell'indicizzatore lungo la strada. Ciò contribuirà a identificare cosa non va.

Oltre a non essere nullo, perché non usare strncmp ()? :)

Vorrei aggiungere un segno di spunta per NULL in modo da avere

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

Quindi non stai dereferenziando un puntatore NULL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top