2015-10-13 77 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中的前一個字符。

我希望這個想法對你很明確。