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