2012-08-31 51 views
0

我有3個問題關於下面的函數。我在代碼中將它們標記爲註釋。什麼是複製一個指針,然後返回第一個

  1. 爲什麼我們通過destmalloc版內存)指出焦炭項目複製到dPtr,然後在年底return dest(處理輸入字符串後)。在dest上操作會不會更簡單?

  2. 該功能基本上只在內部有破折號的情況下翻轉單詞。標記的命令*subword = '\0';NUL字符放在之前遞增的地方(在strncpy) - subword+1subword

  3. 該函數是否容易出現某些緩衝區溢出或其他不良行爲?現在它不會給我任何錯誤,但我想我只是不知道如何調試它。


lenstrlen(word)

char* function(char* word, int len) 
{ 
    char* subword = NULL; 
    char* dest; 
    char* dPtr; 
    size_t n; 

    dest = malloc(len+1); 
    if (dest == NULL) return NULL; 

    dPtr = dest;    /* [1] */ 

    while((subword = strrchr(word, '-'))!= NULL) { 

     n = len - (subword-word) - (dPtr-dest); 
     if (n-1 > 0) 
      strncpy(dPtr, subword+1, n-1); 

     *subword = '\0';  /* [2] */ 
     dPtr += n-1; 
     *dPtr = '-'; 
     dPtr++; 
    } 
    strncpy(dPtr, word, len - (dPtr-dest)); 
    dest[len] = '\0'; 
    return dest;    /* [1] */ 
} 

回答

1
  1. dPtr正在使用通過串移動,並對其進行修改。 dest被保留作爲該修改字符串的開始,最終是函數的返回值。在每次循環迭代結束時,dPtr將指向修改字符串的末尾,並用於每個連續的strncpy。最終該函數返回一個修改過的字符串,並且需要dest來跟蹤它的開始。

  2. subword被空想必因此終止,只有在subword字符將在循環中的strncpy被複制到結果,但其實這是沒有必要的配合使用strncpy。該函數向後穿過查找破折號的字符串。對於每個命中,subword是下一個以劃線分隔的子字符串。這個子串是裏面的一塊裏面的原始字符串,它不是以空字符結尾的。如果您使用的是strcpy,那麼您需要空終止subword,但由於您使用的是strncpy,因此不應該需要空終止符:請謹慎使用n值作爲strncpy的限制。該代碼爲空終止subword,即通過在原始字符串參數內部保留空字符。這導致#3:

  3. 至於不希望的行爲,函數通過修改原始字符串參數來工作 - 它將subword的空終止符放入源字符串中 - 即使它保留修改後的緩衝區並返回字符串。

最後,該代碼可以通過使用strncat操作,而不是strncpy沒有dPtr做。

+0

關於[3] - 我應該首先'strdup'呢? –

+0

@PeterKowalski實際上,我認爲你不需要:在仔細使用'strncat'或'strncpy'的'n'值時,函數在指定時會_stop_,所以你不必擔心null子串的終止。 – pb2q

1

爲什麼我們複製由DEST(malloc內存),以DPTR指出焦炭項目,然後在年底(處理輸入的字符串後)返回dest。對dest進行操作不會更簡單嗎?

因爲由函數結束時,dPtr不會指向dest字符串的開頭,所以如果該指針是dest本身,我們也不會回到我們建全desination字符串。

1
  1. 如果您直接修改dest,函數返回的值將不會相同。所以你需要傳遞一個臨時指針。
  2. \0字符放在*subword(而不是-字符)的地方。