为什么strchr returns第二个参数是字符串时不为NULL放入单引号('text')

why strchr returns not a NULL when the second argument is a string into a single quotation marks ('text')

我尝试编写 strchr() 的实现。

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

大多数情况下它的工作原理相似,除了这个:

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

strchr returns

 p with you, men

while me版本ft_strchrreturnsNULL

我很好奇为什么 strchr 会这样。 ' up' 转换为 unsigned char 是 'p'(如 int 538998128)。

我还在这里发现了不同的实现,即使使用此数据,它的行为也与 strchr 一样。

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.

的值

您展示的另一个实现将 c 强制转换为 unsigned char,然后 然后 将该强制转换的值与 *s 进行比较。这就是为什么其他实现给出预期结果的原因。