在下面的代码中反转字符串,我不明白if语句的用途是什么。这个if语句试图捕获的情况是什么?
这不是多余的,因为你已经设置了char * end = str,所以语句if(str)必须为true或者你的代码在这一点上已经失败了吗?
void reverse(char* str)
{
char *end = str;
char temp;
if (str)
{
while (*end)
{
end++;
}
}
end--; //pulls back one for \0 character
while (str < end)
{
temp = *str;
*str++ = *end;
*end-- = temp;
}
}
答案 0 :(得分:1)
它可以防止取消引用NULL
指针,非常好的做法。
如果str == NULL
,那么*end
将是未定义的行为,因此在解除引用之前检查它确实是一件好事,因为忽略这种可能性将导致一个非常难以实现的错误检测,当然除了使用调试器,但仍然,为什么需要跟踪问题,当你可以避免它,通常是以牺牲几乎没有为代价。
做这样的事情实际上会更好
if (str == NULL)
return;
答案 1 :(得分:0)
因为你已经设置了char * end = str,所以这不是多余的,所以 声明if(str)必须为true或您的代码已经存在 在这一点上失败了吗?
实际上,该行
char *end = str;
即使将空指针作为参数传递,也不会导致&#34;代码失败&#34;。然后,它只会将NULL
分配给end
。
这个if语句试图捕获的情况是什么情况?
由于我们不知道我们是否已经传递了NULL指针,因此我们应该在解除引用之前进行检查。这就是if语句的用途。
答案 2 :(得分:0)
此代码可以正常运行:
void reverse(char* str)
{
if (str != NULL)
{
char *end = str;
while (*end != '\0')
end++;
end--; //pulls back one for \0 character
while (str < end)
{
char temp = *str;
*str++ = *end;
*end-- = temp;
}
}
}
此代码也可以使用:
void reverse(char* str)
{
if (str == NULL)
return;
char *end = str; // Assumes C99 or later
while (*end != '\0')
end++;
end--; //pulls back one for \0 character
while (str < end)
{
char temp = *str;
*str++ = *end;
*end-- = temp;
}
}
两者都确保你永远不会搞乱空指针。像原始代码一样减少空指针会导致灾难(或者至少是未定义的行为)。不要冒风险。
您也可以使用strlen()
- 小心确保您不会遇到空字符串问题:
void reverse(char* str)
{
if (str == NULL || *str == '\0')
return;
char *end = str + strlen(str) - 1;
while (str < end)
{
char temp = *str;
*str++ = *end;
*end-- = temp;
}
}