2015-10-13 70 views
3

我正在努力理解下面的代码,它用于反向以空字符结尾的字符串。我写了评论,解释了我正在努力理解的内容。了解反向字符串的代码

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 
     } 
    } 
} 
+2

@JamesAdkison我在第二个while循环中留下了额外的缩进以显示代码缺少分号。 – NathanOliver

+1

@NathanOliver如果它不会引起分段错误,那将是一个非常恶劣的错误。 –

+0

@ManosNikolaidis是的。我只是不想修改OP的代码,但修正了缩进,因为它在发布时是平坦的。 – NathanOliver

回答

6
  1. if (str)意味着 检查str指针char不为NULL。同:if (str != NULL)

  2. while (*end)检查char通过end指出,不是空终止符。相同:while (*end != '\0')

  3. *str++ = *end分配char指向endstr,然后通过1吨焦炭推进str指针。 *end--前进end向后1字符。

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

+0

我可以再问一个问题。我理解'while(str Jojo

+1

在我的实际答案中添加了评论 –

-1

知道*end = str;

end = is the pointer here

他们正在检查的字符串,如果不为空,如果为空,如果is应采取字符的值,并分配给它

你的情况

字符串是临时

我想你明白炭温度在做什么,*end为指针对待*end作为一个字符串意味着*end,不应为null,温度是性格

while (*end) 
++end; 

它是告诉,虽然最终不为空,这意味着其结果应是一个字符串(例如像约翰名称)

--end它告诉你的是,空应该清楚 那么就应该去到另一个而

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

采取焦炭临时采取的是一个字符串

*str++ = *end然后让人物做出一个字符串或名字 或increement的角色作出一个字符串

end-- = tmp //他们指定字符串是空字符串,从而有vlue

0

*end = str;意味着end指针的值包含列的文字str

if (str)手段检查str指针不null,所以它的当str指向字符时总是true

while (*end)装置检查是否end点为char,当指针是null条件被终止,所以,当指针到达串end结束时,while条件中断和end指针值包含字符串end的最后一个字符。

*str++ = *end这个语句可以分解为2条语句的理解:

第一*str=*end;替代由str与焦炭由end指出指出char值。

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

*end-- = tmp;这个语句可以分解为2条语句的理解:

第一*end = tmp;替代由endtmp字符指出char值。

*end--;更换后将指针移动到字符串end中的前一个字符。

我希望这个想法对你很明确。