我正在尝试编写一个快速函数来过滤char **并将结果放入另一个char **
这就是我写的:
/*
-filterable is what is to be filtered
-filter is the filter
-filtered is the result applying the filter to filterable
*/
void filter(const char** filterable,const char * filter,char** filtered)
{
memset(filtered,'\0',sizeof(filtered));
int i=0;
int j=0;
int filter_length=strlen(filter);
int items=sizeof(filterable)/sizeof((char *) filterable); //segfault?
while(items--)
{
if((strncmp(filter,filterable[i],filter_length)==0))
strcpy(filtered[j++],filterable[i]);
i++;
}
}
问题是我不认为我正在获得“可过滤”的行数,因为我遇到了段错误。有什么建议?这是过滤char **的最快方法吗?
的后评论: 的
好的,我阅读了所有人的评论,以下内容似乎正在发挥作用。鉴于这需要快速,我投入了register关键字,虽然我听说它现在不能保证。
void filter(char ** filterable, const char * filter, char ** filtered, int filters)
{
register int i=0;
register int j=0;
int filter_length=strlen(filter);
while(filters--)
{
if((strncmp(filter,filterable[i],filter_length)==0))
strcpy(filtered[j++],filterable[i]);
i++;
}
}
答案 0 :(得分:2)
您不能使用sizeof(char **)(正如函数实际收到的那样),请参阅this SO Question。您应该将数组的长度作为函数的参数。
答案 1 :(得分:2)
你混淆了指针,数组以及指针指向的内容。
memset(filtered, '\0', sizeof(filtered));
可能会给你一个段错误。 filtered
类型为char **
,这意味着sizeof(filtered)
是指针的大小,而不是指向的任何内容,并且您正在设置filtered
,这是指针char *
,为零。这是未定义的行为,但在大多数现代计算机上将filtered
设置为空指针。您需要为filtered
指向的内容以及char *
指向的内容分配内存,并且您需要传递大filtered
的大小以及它指向的字符串区域有多大是
由于filtered
包含无效的内存地址,因此尝试strcpy()
任何内容
它或表面上指向的任何东西都会尝试访问它,这通常会在Unix / Linux机器上给你一个段错误。
sizeof(filterable)/sizeof(char *) filterable)
没有任何用处。如果filterable
是一个数组,sizeof(filterable)/sizeof(*filterable)
将为您提供filterable
中的元素数量。但是,即使它最初是一个数组,它也作为指针传递,并且丢失了有关它所包含的元素数量的所有信息。
答案 2 :(得分:0)
sizeof(已过滤)在通常的32位计算机上将为4。也就是说,sizeof(char **)== 4.当你调用memset(过滤,'\ 0',sizeof(过滤))时,你正在寻找什么?
在调用memset()之后,segfault可能是由于filter == 0x0000这一事实引起的。
- 皮特