我试图编写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

而me versionft_strchr返回NULL
我很好奇为什么strchr会这样。' up'转换为unsigned char是“p”(如int538998128)。
另外,我在这里发现了不同的实现,即使使用这些数据,它也表现为strhr。
char    *ft_strchr(const char *s, int c) {
    while (*s != (unsigned char) c) {
        if (!*s)
            return NULL;
        s++;}
    return (char *)s;
}

我的版本也不一样,我想他们应该工作类似,但他们没有。我真的很感兴趣为什么?
提前谢谢。

最佳答案

在这个表达式中:

*s == c

术语*s的类型为char,其范围为-128到127或0到255,具体取决于char是有符号的还是无符号的。c的值538998128超出此范围,因此比较永远不会为真。
在函数的开头,有一行:
(unsigned char)c;

但这没用。它将c的值转换为unsigned char,而对结果值不做任何操作。它不会更改c的值。
显示castscunsigned char的另一个实现,然后将该casted值与*s进行比较。这就是为什么另一个实现给出了预期的结果。

10-06 14:28