2012-12-19 183 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。

因此,内循环将永远不会运行。