比较使用strcmp函数

3

使用gcc C99编译

我正在尝试使用字符串比较函数进行字符串比较。 但是,似乎在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

为了终止for循环,您需要一个空字符串:

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

如果没有这个条件,for循环将无法终止,当您调用strcmp时,attribute [i]将指向垃圾。


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

如果您将此代码更改为使用strncmp(),那么您会传递什么给“n”?这样做对于这种情况有何帮助? - bk1e
我会使用9(frametype长度+1)。在这种情况下,它可能没有帮助,因为问题是从一开始就与NULL进行比较。 - Yuval F

1

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


1

你的输入数组(attribute)是否以NULL结尾?你没有列出它,但代码需要它,否则它将随意进入内存,这是segfaults的一个好原因。

插入索引和/或正在比较的属性的打印,以查看它是否符合您对终止的期望。

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


1

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

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

您应该比较 attribute[i] 来匹配名称,或者 attribute[i+1] 来匹配值。

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


0

我会添加一个检查NULL的条件,这样你就可以

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

所以你没有对一个空指针进行解引用。


0
除了不以 null 结尾之外,为什么不使用 strncmp() 呢? :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接