使用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 */
}
}
}
答案 0 :(得分:4)
你需要一个空字符串才能终止for循环:
[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]
null
如果没有这个,for循环将不会终止,当你调用strcmp时,你最终会将属性[i]指向垃圾。
答案 1 :(得分:2)
答案 2 :(得分:1)
添加日志记录并转储所有属性和索引器值。这将有助于确定出现了什么问题。
答案 3 :(得分:1)
您的输入数组(attribute
)是否以NULL结尾?你没有把它列为存在,但代码需要它,否则它只会走进随机存储器,这是段错误的一个很好的原因。
插入索引和/或要比较的属性的打印件,以查看它是否与您对终止的预期方式相同。
对问题的字符串比较部分不太确定...如果输入包含那些方括号等,那么你将找不到任何东西,因为你正在查看每个字符串的开头。如果是这种情况,请尝试strstr()
,它会找到子字符串。
答案 4 :(得分:1)
此代码的上下文是expat解析 - see this post。 attributes数组是名称和值的交替,单个0表示终止。
除非你正在寻找名称或值等于你的测试字符串的任何属性(这有点不寻常),否则你的代码应该将i递增2而不是1 - 这样它就会跳过一个名字和价值。
您应该将属性[i]与名称或属性[i + 1]进行比较以匹配值。
不要假设属性将按任何特定顺序排列。目前,您只查看属性1,这是返回的第一个属性的值。如果有多个属性,则可以按任何顺序返回。
答案 5 :(得分:0)
除了不被终止,为什么不使用strncmp()? :)
答案 6 :(得分:0)
我会添加一个NULL检查,所以你有
if(attribute[1] != NULL && strcmp("frametype", attribute[1]) == 0)
因此,您不会取消引用NULL指针。