使用gcc C99进行编译

我正在尝试使用字符串比较来比较2个字符串。 但是,我似乎在strcmp行上获得了堆栈转储。

**属性将包含这些,所以我正在寻找frametype。

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

     }
}
有帮助吗?

解决方案

此代码的上下文是expat解析 - 看到这篇文章。 attributes数组是名称和值的交替,单个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循环将不会终止,当你调用strcmp时,你最终会将属性[i]指向垃圾。

  1. 属性数组是如何初始化的?一个NULL元素可能已经滑入。
  2. 此外,数组元素必须以NULL结尾。
  3. 您可以考虑使用 strncmp()作为更安全的替代方案to strcmp()。

您的输入数组( attribute )是否以NULL结尾?你没有把它列为存在,但代码需要它,否则它只会走进随机存储器,这是段错误的一个很好的原因。

插入索引和/或要比较的属性的打印件,以查看它是否与您对终止的预期方式相同。

对问题的字符串比较部分不太确定...如果输入包含那些方括号等,那么你将找不到任何东西,因为你正在查看每个字符串的开头。尝试 strstr()如果是这种情况,它会找到子串。

添加日志记录并转储所有属性和索引器值。这将有助于确定出现了什么问题。

除了不被终止,为什么不使用strncmp()? :)

我会添加一个NULL检查,所以你有

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

因此,您不会取消引用NULL指针。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top