2016-01-22 98 views
0

我試圖實現memchr()函數。我的代碼必須返回一個void *,所以如果我們找到該角色,我們可以改變它。問題在這裏。我有兩種方法,一種方法是c_style。static cast或c style cast

void *memChr(const void *s1, int c, size_type n) 
{ 
    const char *p = (const char *)s1; 

    while (n--) 
    if (*p++== (char)c) 
     return (void *)--p; 

     return 0; 
} 

這些方法使用C樣式轉換,這裏我們發送S1爲const,這是正確的事業,我們不希望任何變化,然後我們回到P作爲非const的指針爲void這又是正確的。任何方式這是舊的,我想要更多的C++方法。像這樣:

void *memChr(void *s1, int c, int n) 
{ 
    char *p = static_cast< char *>(s1); 

    while (n--) 
    if (*p++ == static_cast<char>(c)) 
     return static_cast<void *>(p); 

    return 0; 
} 

我這些代碼的問題是:我不能投一個const指向一個非常量指針.static_cast是比C樣式轉換更安全,但它讓我使用非const的參數,它是不適當 。使用標準的memchr()參數,無法用static_cast實現。 那麼哪種方法更好?我剛剛完成了C++教程,我正在嘗試學習好的編碼,但我有點困惑。

+0

加上'const_cast' –

+2

如果什麼's1'原本指向常量數據?也就是說,不管你使用哪種風格,只要你想返回一個非const指針,你應該將's1'聲明爲非const指針。然後,你不需要'const_cast'。爲了清楚起見,我會推薦C++風格的演員。 – cqdjyy01234

+4

從輸入中刪除'const'限定符是不好的做法。如果你想在返回的指針處修改數據,那麼把非const作爲輸入。或者更好地返回const指針並強制調用者明確移除'const'。 –

回答

0

您可以用const_cast從常量到投非const指針:

void *memChr(const char *s1, int c, int n) 
{ 
    char *p = const_cast< char *>(s1); 

    while (n--) 
    if (*p++ == static_cast<char>(c)) 
     return static_cast<void *>(p); 

    return 0; 
} 
+3

我認爲這個答案應該至少帶有一個免責聲明,儘管這是有效的,但將const指針作爲函數參數是非常糟糕的做法,然後將該const函數轉換爲該函數。 –

+1

同意@void_ptr。解析const數據會導致嚴重的不可預測的結果。如果一個函數要修改一個參數,那麼聲明參數'const'絕對沒有意義。這對功能的調用者說謊,告訴他們他們的數據不會被修改,然後將它們刺在後面。真的很冷漠。 – user4581301