题
使用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 */
}
}
}
其他提示
你需要一个空字符串才能终止for循环:
[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]
null
如果没有这个,for循环将不会终止,当你调用strcmp时,你最终会将属性[i]指向垃圾。
- 属性数组是如何初始化的?一个NULL元素可能已经滑入。
- 此外,数组元素必须以NULL结尾。
- 您可以考虑使用 strncmp()作为更安全的替代方案to strcmp()。 醇>
您的输入数组( attribute
)是否以NULL结尾?你没有把它列为存在,但代码需要它,否则它只会走进随机存储器,这是段错误的一个很好的原因。
插入索引和/或要比较的属性的打印件,以查看它是否与您对终止的预期方式相同。
对问题的字符串比较部分不太确定...如果输入包含那些方括号等,那么你将找不到任何东西,因为你正在查看每个字符串的开头。尝试 strstr()
如果是这种情况,它会找到子串。
添加日志记录并转储所有属性和索引器值。这将有助于确定出现了什么问题。
除了不被终止,为什么不使用strncmp()? :)
我会添加一个NULL检查,所以你有
if(attribute[1] != NULL && strcmp("frametype", attribute[1]) == 0)
因此,您不会取消引用NULL指针。
不隶属于 StackOverflow