1

我试图编写strchr().

char    *ft_strchr(const char *s, int c)
{
(unsigned char)c;
    while (*s)
    {
        if (*s == c)
            return ((char *)s);
        s++;
    }
    if (c == '\0')
        return ((char *)s);
    return (NULL);
}

它在大多数情况下都类似,除了这个:

printf("%s\n", strchr("Whats up with you, men", '  up'));

strchr返回

 p with you, men

而我的版本ft_strchr返回NULL

我很好奇为什么strchr会这样。' up'转换unsigned char为“p”(如int538998128)。

此外,我在这里发现了不同的实现,即使有这些数据,它也表现得像 strchr。

char    *ft_strchr(const char *s, int c) {
    while (*s != (unsigned char) c) {
        if (!*s)
            return NULL;
        s++;}
    return (char *)s;
}

我的版本也不同,我想他们应该工作相似,但他们没有。我真的很感兴趣为什么?

提前致谢。

4

1 回答 1

1

在这个表达式中:

*s == c

*s类型为的 termchar的范围为 -128 到 127 或 0 到 255,具体取决于char有符号还是无符号。的值 538998128c不在此范围内,因此比较永远不会为真。

在函数的开头,你有这一行:

(unsigned char)c;

但这无济于事。它将值转换c为 anunsigned char并且对结果值不做任何事情。它不会改变 的值c

您展示的另一个实现强制转换cunsigned char然后将该强制转换的值与*s. 这就是其他实现给出预期结果的原因。

于 2017-12-20T15:07:51.163 回答