сравнение с использованием strcmp - PullRequest
2 голосов
/ 04 марта 2009

компиляция с 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 */
        }

     }
}

Ответы [ 7 ]

4 голосов
/ 04 марта 2009

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

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

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

2 голосов
/ 04 марта 2009
  1. Как инициализируется массив атрибутов? Элемент NULL мог проскользнуть внутрь.
  2. Кроме того, элемент массива должен заканчиваться на NULL.
  3. Вы можете рассмотреть возможность использования strncmp () в качестве более безопасной альтернативы strcmp ().
1 голос
/ 04 марта 2009

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

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

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

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

1 голос
/ 04 марта 2009

Ваш входной массив (attribute) заканчивается NULL? Вы не указываете это как существующее, но код требует это, иначе это просто войдет в случайную память, которая является хорошей причиной segfaults.

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

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

1 голос
/ 04 марта 2009

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

0 голосов
/ 04 марта 2009

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

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

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

0 голосов
/ 04 марта 2009

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

...