为什么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_strchr
returnsNULL
我很好奇为什么 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
进行比较。这就是为什么其他实现给出预期结果的原因。
我尝试编写 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_strchr
returnsNULL
我很好奇为什么 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
进行比较。这就是为什么其他实现给出预期结果的原因。