使用指针反转C中的字符串 - if语句的用途?

时间:2015-02-21 01:29:28

标签: c string

在下面的代码中反转字符串,我不明白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;
    }    
}

3 个答案:

答案 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;
    }
}