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,我希望输出为“你是多么喜欢”。
感谢。
答案 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 && b
和a
都被评估为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
...
...
...