写一个快速过滤功能对于一个char **

问题描述:

我试图写一个快速功能用于过滤一个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 **的最快方法吗?

后评论:

好吧,我看大家的意见和下面的似乎是工作。鉴于这需要很快,我把注册关键字,虽然我听说它不能保证这些天什么。

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++; 
    } 
} 
+1

'sizeof'的使用不当。你将一个指针作为参数传递给运算符'sizeof'。您需要在函数参数中传递大小。 – pmg 2011-03-31 14:29:45

+2

由于这个quetion被标记为C++,你有没有任何理由不在这里使用C++容器,而不是原始缓冲区?即:std :: vector <:string> – Jem 2011-03-31 14:35:09

+0

'sizeof(可过滤)/ sizeof((char *)可过滤)'始终为1,因为指向'char **'和char *'的指针具有相同的大小。如果您想知道可过滤元素的数量,请将其作为参数传递给函数。 – Thalur 2011-03-31 14:43:44

您已经混淆了指针,数组和指向哪些指针。

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中的元素数。然而,即使它最初是一个数组,它也是作为一个指针传递的,并且丢失了它所包含的元素数量的所有信息。

您不能使用sizeof(char **)(如实际接收的函数),请参阅this SO Question。您应该将该数组的长度作为该函数的参数。

sizeof(过滤)将在通常的32位机器上为4。也就是sizeof(char **)== 4。当你调用memset(过滤,'\ 0',sizeof(过滤))时,你正在寻找什么?

段错误可能是由调用memset()后过滤== 0x0000的事实引起的。

- pete