写一个快速过滤功能对于一个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++;
}
}
您已经混淆了指针,数组和指向哪些指针。
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(过滤)将在通常的32位机器上为4。也就是sizeof(char **)== 4。当你调用memset(过滤,'\ 0',sizeof(过滤))时,你正在寻找什么?
段错误可能是由调用memset()后过滤== 0x0000的事实引起的。
- pete
'sizeof'的使用不当。你将一个指针作为参数传递给运算符'sizeof'。您需要在函数参数中传递大小。 – pmg 2011-03-31 14:29:45
由于这个quetion被标记为C++,你有没有任何理由不在这里使用C++容器,而不是原始缓冲区?即:std :: vector <:string> – Jem 2011-03-31 14:35:09
'sizeof(可过滤)/ sizeof((char *)可过滤)'始终为1,因为指向'char **'和char *'的指针具有相同的大小。如果您想知道可过滤元素的数量,请将其作为参数传递给函数。 – Thalur 2011-03-31 14:43:44