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

In C, given char *ptr and defined till ptr+n, when I tried statements similar to (ptr+i) = (ptr+j); where i,j<n, I got "lvalue error". Why?

在编译下面给出的代码时,我得到了错误:对于语句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等于13 / 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;
}