Вопрос
компиляция с 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.
Ваш входной массив ( attribute
) завершен NULL? Вы не указываете это как существующее, но код требует это, иначе это просто войдет в случайную память, которая является хорошей причиной segfaults.
Вставьте отпечаток сравниваемого индекса и / или атрибута, чтобы увидеть, ведет ли он себя так, как вы ожидаете в отношении завершения.
Не уверен в части вопроса о сравнении строк ... Если входные данные содержат эти квадратные скобки и т. д., вы ничего не найдете, так как смотрите в начале каждой строки. Попробуйте strstr ()
, если это так, он находит подстроки.
Добавьте ведение журнала и сбросьте все атрибуты и значение индексатора по пути. Это поможет определить, что происходит не так.
Помимо того, что он не завершен нулем, почему бы не использовать strncmp ()? :) Р>
Я бы добавил проверку на NULL, чтобы у вас был
if(attribute[1] != NULL && strcmp("frametype", attribute[1]) == 0)
Таким образом, вы не разыменовываете нулевой указатель.