3

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

     }
}
4

7 回答 7

4

您需要有一个空字符串才能终止 for 循环:

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

如果没有这个,for 循环将不会终止,并且当您调用 strcmp 时,您最终会得到指向垃圾的属性 [i]。

于 2009-03-04T11:18:37.657 回答
3
  1. 属性数组是如何初始化的?NULL 元素可能已滑入。
  2. 此外,数组元素必须以 NULL 结尾。
  3. 您可以考虑使用strncmp()作为 strcmp() 的更安全替代方法。
于 2009-03-04T11:19:28.810 回答
1

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

于 2009-03-04T11:19:35.597 回答
1

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

插入要比较的索引和/或属性的打印,以查看它在终止方面的行为是否符合您的预期。

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

于 2009-03-04T11:19:41.087 回答
1

此代码的上下文是 expat 解析 -请参阅此帖子。属性数组是交替的名称和值,以单个 0 终止。

除非您正在寻找名称或值等于您的测试字符串的任何属性(这有点不寻常),否则您的代码应该将 i 增加 2 而不是 1 - 这样它就会同时遍历名称和值。

您应该比较属性 [i] 以匹配名称,或比较属性 [i+1] 以匹配值。

不要假设属性将按任何特定顺序排列。目前您只查看属性1,它是返回的第一个属性的值。如果有多个属性,它们可以按任意顺序返回。

于 2009-03-04T11:37:56.393 回答
0

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

于 2009-03-04T11:21:47.773 回答
0

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

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

因此,您没有取消引用 NULL 指针。

于 2009-03-04T11:59:34.580 回答