在编译下面给定的代码时,我得到了错误:lvalue需要作为赋值的左操作数对于表述str+i = str+((len-1)-i);
和str+((len-1)-i) = temp;
,
为什么?
char* str_reverse(char *str, int len)
{
char *temp;
int i, mid;
if(len%2 == 0)
{
mid = len/2 - 1;
}
else
{
mid = (len-1)/2;
}
for(i=0;i<mid;i++)
{
temp = str+i;
str+i = str+((len-1)-i);
str+((len-1)-i) = temp;
}
return str;
}
str
是一个左值,因为它是内存中包含地址的位置。
str+i
只是一个右值,因为它只是一个地址
像这样的表达式
str + i
右值。它们不能被分配。与写
相同int x = 10;
int y = 20;
x + y = 30;
但无论如何,你的函数本质上是不正确的。您需要交换字符,而不是尝试交换指针表达式。
还有if语句
if(len%2 == 0)
{
mid = len/2 - 1;
}
else
{
mid = (len-1)/2;
}
没有太大意义,因为表达式
的结果len / 2
无论len
是偶数还是后面的奇数,
例如2 / 2
等于1
,3 / 2
也等于1
。
在函数中使用指针,可以按以下方式定义
char * str_reverse( char *str, size_t len )
{
if ( len != 0 )
{
for ( char *left = str, *right = str + len; left < --right; ++left )
{
char c = *left;
*left = *right;
*right = c;
}
}
return str;
}
使用size_t表示字符串长度
你太复杂了:
char* str_reverse(char *str, size_t len)
{
char temp, *start = str, *end = str + len -1;
if(str && *str)
{
while(start < end)
{
temp = *start;
*start++ = *end;
*end-- = temp;
}
}
return str;
}