2013-01-23 37 views
0

我看到這個算法網上扭轉一個字符串,我對此有些懷疑,我將在代碼的末尾註明:這個reverseString算法是如何工作的?

void reverseString(char *original_string) 
    { 
     char *end = original_string; 
     char tmp; 

     if(original_string) { 
      while(*end) { 
       ++end; 
      } 
      --end; 
      while (original_string < end) { 
       tmp = *original_string; 
       *original_string++ = *end; 
       *end-- = tmp; 
      } 
     } 
//This line doesn't have the complete reversed string. Why? 
printf("%s\n", original_string); 
    } 

1)在while循環......爲什麼我們比較兩個指針?我們如何知道價值會變得更大還是更小?這些只是指針,對吧?

2)爲什麼我們不返回任何東西?反向字符串在哪裏?如果我們暗示反轉的字符串在original_string中,我們是不是應該使用指向指針的指針,以便影響範圍在外部?

3)如果我做到以下幾點:

char test[] = "hello"; 
    reverseString(test); 
    printf("%s\n", test); 

我可以看到 「2009東海生日賀」。但是,如果我在函數reverseString的最後一行做printf("%s\n", original_string);,我只是得到「leh」。這是爲什麼?

回答

4

您有兩個指針指向左側部分的開始和結尾。在每一步中,您交換這些指針指向的字符,然後減少左右兩個方向的字符串 - 開始和結束。比較指針具有以下含義 - 直到間隔的開始不在間隔結束後,我們仍然有一個間隔時間才能反轉。希望這是有道理的。

你不需要返回任何東西 - 字符串被反轉,所以參數同時出入。

3)在該函數中,您獲取指向該字符串的指針的副本,並在其執行過程中進行修改,以便指針由最後一行修改時不會再指向字符串的開頭,但到中間,在那裏留在最後。

+0

但是在while(original_string

+0

數組在內存中表示爲單個內存塊,每個元素都放在前一個內存之後。因此,對於數組,指向元素的指針與其索引之間存在直接關係。 –

+0

好吧,現在有道理!我忘了再問一件事。爲什麼從結果的外部打印字符串是正確的,但從方法的最後一行開始,我沒有得到完整的反轉字符串? –