2011-03-31 57 views
0

我試圖寫一個快速功能用於過濾一個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 Jem 2011-03-31 14:35:09

+0

'sizeof(可過濾)/ sizeof((char *)可過濾)'始終爲1,因爲指向'char **'和char *'的指針具有相同的大小。如果您想知道可過濾元素的數量,請將其作爲參數傳遞給函數。 – Thalur 2011-03-31 14:43:44

回答

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

您不能使用sizeof(char **)(如實際接收的函數),請參閱this SO Question。您應該將該數組的長度作爲該函數的參數。

0

sizeof(過濾)將在通常的32位機器上爲4。也就是sizeof(char **)== 4。當你調用memset(過濾,'\ 0',sizeof(過濾))時,你正在尋找什麼?

段錯誤可能是由調用memset()後過濾== 0x0000的事實引起的。

- pete