2016-01-22 65 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