理解代码来反转字符串

时间:2015-10-13 13:01:45

标签: c++

我正在努力理解下面用于反转以null结尾的字符串的代码。我写了评论,解释了我正在努力理解的界限。

void reverse(char *str)
{
    char *end = str;
    char tmp;
    if (str)     // I don't understand what is happening within this if loop and how this is carried out for `str` which is not Boolean
    {
        while (*end) // I dont know what this means either
        {
            ++end;
        }
        --end;

        while (str < end)
        {
            tmp = *str
                *str++ = *end //I am confused as to why this is not just *str = *end
                *end-- = tmp; //Similarly, why is this not *end = tmp
        }
    }
}

3 个答案:

答案 0 :(得分:6)

  1. if (str)表示 检查str指向char的指针是否为NULL。与:if (str != NULL)

  2. 相同
  3. while (*end)检查char指向的end是否为空终止字符。与:while (*end != '\0')

  4. 相同
  5. *str++ = *endchar指向的end分配给str,然后将str指针提前1个字符。 *end--向前推进end 1个字符。

  6. while (str < end)将地址作为数字进行比较(而不是指针指向的值)。这只有在两个指针指向同一存储块中的不同位置时才有意义,例如在这种情况下的c字符串或任何数组。如果str指向字符串的第一个元素而end指向第二个元素,则str < end将为真。第1和第2位的实际字符将不予考虑

答案 1 :(得分:0)

*end = str;表示end指针的值包含字符串str的字符

if (str)表示检查str指针是否不是null,因此当true指向char时,它总是str

while (*end)表示检查end是否指向char,当指针为null条件终止时,所以当指针到达字符串end的末尾时,{{1 condition break和while指针值包含字符串end的最后一个字符。

end这个陈述可以分解为2个陈述来理解它:

第一个*str++ = *end*str=*end;指向的char值替换为str指向的char。

第二个end在替换后将指针移动到字符串*str++;中的下一个字符。

str这个陈述可以分解为2个陈述来理解它:

第一个*end-- = tmp;*end = tmp;指向的char值替换为end char。

第二个tmp在替换后将指针移动到字符串*end--;中的前一个char。

我希望你的想法很清楚。

答案 2 :(得分:-1)

知道*end = str;

end = is the pointer here

如果字符串为null,如果is应取char的值并赋值给它,那么它们是否为null;

在你的情况下,字符串是temp

我想让你理解char temp正在做什么和*end作为指针将*end视为字符串,意味着*end不应为null,temp是字符

while (*end) 
 ++end;

它告诉我,虽然end不是null,意味着结果应该是一个字符串(例如像john这样的名字)

--end它告诉你null应该是清楚的

然后它应该转到另一个

while (str < end)因为字符串为空

将char temp作为字符串

*str++ = *end然后允许字符使其成为字符串或名称 或者让角色接受使其成为一个字符串

end-- = tmp //他们将字符串分配给该空字符串以获得vlue