为char编写快速过滤功能**

时间:2011-03-31 14:26:32

标签: c algorithm

我正在尝试编写一个快速函数来过滤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++;
    }
}

3 个答案:

答案 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这一事实引起的。

- 皮特