Вопрос

компиляция с gcc C99

Я пытаюсь сравнить 2 строки, используя сравнение строк. Однако мне кажется, что я получаю дамп стека в строке strcmp.

Атрибут

** будет содержать их, поэтому я ищу тип кадра.

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

Это правильный способ сравнения.

Большое спасибо за любые предложения,

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

     }
}
Это было полезно?

Решение

Контекст этого кода - синтаксический анализ. см. этот пост . Массив атрибутов - это чередующиеся имя и значение с одним 0 для завершения.

Если вы не ищете какой-либо атрибут, имя или значение которого совпадает с вашей тестовой строкой (что было бы несколько необычно), то ваш код должен увеличивать i на 2, а не на 1, чтобы он перешагнул как имя, так и значение.

Вы должны сравнивать либо атрибут [i] для соответствия имени, либо атрибут [i + 1] для соответствия значению.

Не думайте, что атрибуты будут в каком-то определенном порядке. В настоящее время вы смотрите только на атрибут 1 , который является значением первого возвращенного атрибута. Если имеется более одного атрибута, они могут быть возвращены в любом порядке.

Другие советы

Чтобы завершить цикл for, вам понадобится пустая строка:

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

Без этого цикл for не завершится, и вы получите атрибут [i], указывающий на мусор при вызове strcmp.

<Ол>
  • Как инициализируется массив атрибутов? Возможно, вставлен элемент NULL.
  • Кроме того, элемент массива должен заканчиваться на NULL.
  • Вы можете использовать strncmp () в качестве более безопасной альтернативы. в strcmp ().
  • Ваш входной массив ( attribute ) завершен NULL? Вы не указываете это как существующее, но код требует это, иначе это просто войдет в случайную память, которая является хорошей причиной segfaults.

    Вставьте отпечаток сравниваемого индекса и / или атрибута, чтобы увидеть, ведет ли он себя так, как вы ожидаете в отношении завершения.

    Не уверен в части вопроса о сравнении строк ... Если входные данные содержат эти квадратные скобки и т. д., вы ничего не найдете, так как смотрите в начале каждой строки. Попробуйте strstr () , если это так, он находит подстроки.

    Добавьте ведение журнала и сбросьте все атрибуты и значение индексатора по пути. Это поможет определить, что происходит не так.

    Помимо того, что он не завершен нулем, почему бы не использовать strncmp ()? :)

    Я бы добавил проверку на NULL, чтобы у вас был

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

    Таким образом, вы не разыменовываете нулевой указатель.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top