【问题标题】: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?在 C 中,给定 char *ptr 并定义直到 ptr+n,当我尝试类似于 (ptr+i) = (ptr+j); 的语句时我,j<n,我得到“左值错误”。为什么?
【发布时间】:2021-12-10 11:10:58
【问题描述】:

在编译下面给出的代码时,我得到了 error: lvalue required as left operand of assignment 语句 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+i 不是左值(例如参见What is an lvalue)。该语句不会按照您的意愿交换字符。应该是*(str+i)=*(str+((len-1)-i))。或者更简单的str[i] = str[len-1-i]。其他所有作业都一样
  • 对不起,我忘了提这个:我想将(str+((len-1)-i))的地址分配给str+i,而不是其中存储的值。
  • 为什么?这是没有意义的。这根本不会交换字符。
  • 我想反转存储在指针str 中的字符顺序。所以,我想重新分配它们的内存地址,这样:调用str[0] 将返回str[(n-1)-0] 的值。调用str[1] 将返回str[(n-1)-1] 的值。调用str[2] 将返回str[(n-1)-2] 的值。 . . .等等。 (我不知道这种方法是否有效,我是编程新手,因此我不太了解它的规则。)我想知道,如果这种说法不符合我的目的,为什么?跨度>
  • @Algorithmophile 您不能单独重新分配数组元素的地址。这是一个数组的定义,它的元素都存储在连续的内存中。所以数组中每一个元素的地址总是与基地址有一个固定的偏移量,也就是数组的开头。如果你想重新排列数组的元素,重新排列值是你唯一的选择。

标签: c pointers reverse c-strings function-definition


【解决方案1】:

这样的表达方式

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;
}

【讨论】:

    【解决方案2】:

    使用 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;
    }
    

    【讨论】:

      【解决方案3】:

      str 是左值,因为它是内存中包含地址的位置。

      str+i 只是一个右值,因为它只是一个地址

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        • 2020-04-28
        • 1970-01-01
        • 2019-09-29
        相关资源
        最近更新 更多