我试图编写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 version
ft_strchr
返回NULL
我很好奇为什么
strchr
会这样。' up'
转换为unsigned char
是“p”(如int
538998128)。另外,我在这里发现了不同的实现,即使使用这些数据,它也表现为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
的值。显示casts
c
到unsigned char
的另一个实现,然后将该casted值与*s
进行比较。这就是为什么另一个实现给出了预期的结果。