2012-12-19 220 views
3

我想出了我認爲是一個混亂的解決方案,以一個尷尬的(儘管標準)問題: 對於給定的用戶輸入,逆轉的話字母for循環不工作

如:

這是一個標準測試

變得

SIHT SI一個dradnats TSET

,而不是

TSET dradnats一個SI SIHT

事情的心臟是這段代碼

while (!iscntrl(user_input[x])) // quit when new line is read 
     { 
     restart: 
     x++; 
     puts("first level test"); 
     if (user_input[x]==' ') 
      { 
      puts("second level test"); 
      for (i=x; user_input[i]!=' '; --i) 
       {    
       reverse_words[k]=user_input[i]; 
       k++; 
       puts("third level test"); 
       goto restart; 
       } 
      } 
     } 

(是的,我知道,有在那裏一個goto:/)

,但循環的第三級從未被觸及。

想必也有一些是完全錯誤的(i=x; user_input[i]!=' '; --i)作爲一個for循環參數?

x,ik在第一次循環開始之前都被初始化爲整數== 0。

+2

將反轉邏輯分解爲函數可能會使這些問題更易於調試。 –

回答

5

那麼,你的條件相矛盾在這裏:

if (user_input[x]==' ') 
      { 
      puts("second level test"); 
      for (i=x; user_input[i]!=' '; --i) 

您只有在user_input[x]是空間進入,但你循環,只要它不等於空間。

+0

是的,我應該有i = x-1,然後把它當作i--而不是--i ....當我遇到一個單詞的結尾時,我想回到過去,把這個單詞的字符剛剛結束到reverse_word數組中...而不影響x(輸入數組中的位置)。當遇到的單詞已經輸入reverse_word數組中時,我想回到我離開的地方(在x處)... – Stumbler

+0

儘管現在我已經想到了...我還需要一個條件來識別何時正在讀取輸入數組的第一個字符(即輸入第一個字)...由於字符串不以空終止符開始,所以很尷尬:/ – Stumbler

+0

使用您的發佈代碼,我無法理解整個邏輯。但是我所建議的是扭轉整體,然後扭轉每個單詞。 –

2

問題是本節:

if (user_input[x]==' ') 
      { 
      puts("second level test"); 
      for (i=x; user_input[i]!=' '; --i) 
       {    

在第一行,你已經確定user_input[x]==' '

幾行後,你設置了一個循環,將同時user_input[i]!=' '運行。

但是,您已經設置了i = x ......因此,在第一遍中,您要求user_input[x]!=' ' ......您已將其確定爲false。

因此,內循環將永遠不會運行。