2009-03-04 109 views
2

使用gcc编译C99使用strcmp比较

我想比较使用字符串比较的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 */ 
     } 

    } 
} 

回答

1

此代码的上下文是expat解析 - see this post。属性数组是交替的名称和值,一个0终止。

除非你正在寻找名称或值等于你的测试字符串的任何属性(这有点不同寻常),那么你的代码应该增加2而不是1 - 这样它就可以在名称和一个值。

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

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

4

你需要有一个空字符串,以终止for循环:

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

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

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

如果您将此代码更改为使用strncmp(),您会传入'n'什么?这在这种情况下会有什么帮助? – bk1e 2009-03-06 07:31:53

1

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

1

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

插入要比较的索引和/或属性的打印,以查看它是否按照您期望的终止方式工作。

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

0

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

0

所以你必须

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

所以你是不是取消对NULL指针我想补充的NULL检查。