虽然循环不工作!

时间:2011-04-23 14:55:28

标签: c++ while-loop reverse

using namespace std;

void reverse(char a[],int slen, int elen)
 {
     int start,end,temp;
     for(start=slen,end=elen;start<end;start++,end--)
            {
                temp=a[start];
                a[start]=a[end];
                a[end]=temp;
            }
 }

 void reverseall(char b[])
  {
      char a[15];
      int i,j,n=0,len;
      for(i=14,j=0;i>=0,j<15;i--,j++)
           a[j]=b[i];

      i=0;
      j=0;

      while(a[i]!='\0')
         {cout<<"h";
            n++;
            i++;
         }

      while(j!=n)
         {
            if(j!=0)
              j++;
            len=0;
            while(a[j]!= ' ' && a[j]!='\0')
             {
                len++;
                j++;
             }
            reverse(a,j-len,j-1);
         }

     for(i=0;i<n;i++)
        cout<<a[i];
  }
int main()
 {
     char b[20]="hi how are you";
     reverseall(b);
     return 0;
 }

我修改了reversing in place的工作程序,只添加了3行,而while循环现在不能正常工作。

 for(i=14,j=0;i>=0,j<15;i--,j++)
               a[j]=b[i];

          i=0;
          j=0;  

这是程序的link,我希望输出为“你是多么喜欢”。

感谢。

3 个答案:

答案 0 :(得分:5)

条件i>=0,j<15可能不会按照您的想法执行。首先,评估i>=0(其为真或假),然后丢弃结果,然后评估j<15并传递结果。也就是说,i>=0,j<15仅相当于j<15。你可能想要的是i>=0 && j<15

注意我是如何用二元和运算符替换逗号运算符的。通常,表达式a, b表示首先评估a,然后评估b,后者的结果是整个表达式的结果。除非评估a副作用(例如修改变量),否则这是无稽之谈。任何理智的编译器都会在这里警告你,如果你提高了警告级别,你几乎应该这样做。

表达式a && b表示首先评估a。如果为false,则a && b的结果也为假。否则,将评估b,其结果是整个表达式的结果。也就是说,如果a && ba都被评估为true,则表达式b仅评估为true。请注意,如果b已经为假,则根本不评估a,因为无论b具有什么值,它都不可能再影响结果。此行为称为短路评估

答案 1 :(得分:2)

将其更改为

  for(i=13,j=0;i>=0,j<15;i--,j++)
       a[j]=b[i];
  a[14] = '\0';

它会起作用(codepad)。

发生了什么事情是你颠倒了输入字符串,但最后它包含一个\0字符,所以你的数组第一个字符是\0,其余的代码不再做任何事了。

所以我们现在正在做的是反转除\0字符以外的所有字符,并在字符串的末尾添加\0

请注意,您到处都在使用魔术数字。对于测试,这可能没问题,但你应该改变它,例如。获取输入字符串的长度并使用它而不是幻数13/14/15。

看一下这个codepad,看看如何做得更好。摘录:

int b_len = strlen(b);
char* a = (char*)malloc((b_len + 1) * sizeof(char));
for(i = 0; i < b_len; i++)
     a[b_len - i - 1] = b[i];
a[b_len] = '\0';

[...]

free(a);

答案 2 :(得分:1)

for循环不应该在开头有“{”而在最后有“}”?只要它不止一行。

for {
...
...
...
}

而不是:

for
...
...
...