在 C 中,给定 char *ptr 并定义到 ptr+n,当我尝试类似于 (ptr+i) = (ptr+j) 的语句时;我,j<n,我得到了"lvalue error".为什么?



在编译下面给定的代码时,我得到了错误: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;
}

相关内容