2010-10-06 74 views
0

我有這個C函數,它試圖告訴我子字符串是否包含在一個字符串中。在C中我的子字符串函數內存問題?

int sub_string(char parent [1000], char child [1000]){ 

    int i; 
    i = 0; 
    int parent_size = (int) strlen(parent); 
    int child_size = (int) strlen(child); 
    char tempvar [child_size]; 

    int res; 
    res = 1; 

    while(i<(parent_size - child_size + 1) && res != 0){ 

    strncpy(tempvar, parent + i, child_size); 

    if(strcmp(tempvar, child)==0){ 
     res = 0; 
    } 
    i++; 

    memset(tempvar, 0, child_size); 
    } 

    memset(tempvar, 0, sizeof(tempvar)); 
    return res; 
} 

現在奇怪的是,當我通過一個字符串「HOME_DIR =/tmp目錄/」和「HOME_DIR」它返回一個0在第一時間輪,但之後,我再次調用此函數,它返回一個1說它沒有找到它!

我猜這是一個內存問題,但我不知道在哪裏,我將不勝感激任何幫助。

+0

你在使用什麼編譯器?一些編譯器可能在使用變量分配數組時遇到問題:char tempvar [child_size]; – Matthieu 2010-10-06 16:51:40

+0

我認爲GCC與GNU Make 3.81。我是C新手,所以不確定我是否給了你正確的信息! – Kay 2010-10-06 17:01:09

回答

1

有什麼理由不能使用strstr函數嗎?否則,你應該清理你的代碼中的一些東西。對於初學者來說,由於你限制數組的長度達到1000個字符,所以你應該使用strnlen而不是strlen,限制爲1000.你也應該創建你在開始複製之前應該將tempvar數組清零。如果parent不是空的,你可以在你的while循環中運行數組的末尾。我還建議使用strncmp並給出長度限制(一般來說,如果您使用C字符串庫,則應該使用'n'版本的函數,即strnlen而不是strlen,以便在操作上放置邊界長度,有助於保護代碼中的緩衝區溢出和潛在的安全漏洞)。

+0

strstr的乾杯pstrjds! – Kay 2010-10-06 17:08:38

+0

np - 當有一個可用時,我總是嘗試使用標準庫函數。 – pstrjds 2010-10-07 19:51:23

1

我注意到一些問題,這個程序:

  1. 使用指針,而不是固定的字符數組。這是更優化的空間。所以你的功能定義變成int sub_string(char *parent, int parent_len, char *child, int child_len)。請注意,由於我傳遞指針,我還需要傳遞字符串的長度,所以我知道要傳遞多少。所以現在你可以像循環中的*(parent+i)那樣訪問你的字符串。
  2. i<(parent_size - child_size + 1)這種情況對我來說有點危險。假設父母是len &孩子是75.所以這個表達式變成i<26。現在,您的循環將在i>26時終止。所以tempvar將有parent_string到索引25.那麼這又如何工作?
1

的一個問題是:(含終止 '\ 0')下面

char tempvar [child_size]; 

的strcmp將child_size +1字符比較,因此它的未定義的行爲。 你知道C標準函數strstr和strncmp嗎?

+0

我找不到要包含的子字符串函數 - 非常感謝strstr! – Kay 2010-10-06 17:07:47

0

sizeof(tempvar)不返回child_size