Pregunta

compilando con gcc C99

Estoy tratando de comparar 2 cadenas usando la cadena de comparación. Sin embargo, parece que obtengo un volcado de pila en la línea strcmp.

El atributo

** contendrá estos, por lo que estoy buscando un tipo de trama.

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

Esta es la forma correcta de comparar.

Muchas gracias por cualquier sugerencia,

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

     }
}
¿Fue útil?

Solución

El contexto de este código es el análisis de expatriados - vea esta publicación . La matriz de atributos es nombre y valor alternos, con un solo 0 para terminar.

A menos que esté buscando algún atributo cuyo nombre o valor sea igual a su cadena de prueba (que sería un tanto inusual), entonces su código debería incrementar i en 2 en lugar de 1, de modo que pase por encima de un nombre y un valor.

Debería estar comparando el atributo [i] para que coincida con un nombre, o el atributo [i + 1] para que coincida con un valor.

No asuma que los atributos estarán en ningún orden en particular. Actualmente solo estás mirando el atributo 1 , que es el valor del primer atributo devuelto. Si hay más de un atributo, se pueden devolver en cualquier orden.

Otros consejos

Necesitará tener una cadena nula para terminar el bucle for:

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

Sin esto, el bucle for no terminará y terminarás con el atributo [i] apuntando a la basura cuando llames a strcmp.

  1. ¿Cómo se inicializa la matriz de atributos? Es posible que se haya deslizado un elemento NULL.
  2. Además, el elemento de la matriz debe terminar con un valor NULL.
  3. Puede considerar usar strncmp () como una alternativa más segura a strcmp ().

¿Su matriz de entrada ( atributo ) está terminada en NULL? No lo enumeras como tal, pero el código lo requiere, de lo contrario, simplemente pasará a la memoria aleatoria, lo cual es una buena causa de segfaults.

Inserte una impresión del índice y / o el atributo que se está comparando, para ver si se comporta de la manera esperada con respecto a la terminación.

No estoy tan seguro acerca de la parte de la pregunta de comparación de cadenas ... Si la entrada contiene esos corchetes, no encontrará nada ya que está viendo el comienzo de cada cadena. Pruebe strstr () si ese es el caso, encuentra subcadenas.

Agregue el registro y voltee todos los atributos y el valor del indexador en el camino. Esto ayudará a identificar qué está mal.

Más allá de no haber terminado en nulo, ¿por qué no usar strncmp ()? :)

Agregaría un cheque para NULL para que tenga

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

Por lo tanto, no está desreferir un puntero NULO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top