对结构体中字符数组赋值时,出现表达式必须是可修改的左值的问题。以及strcpy和memcp区别

问题:

在C++中为结构体中的字符数组赋值时,出现”表达式必须是可修改的左值“的错误提醒,编译报错“不可指定数据类型”。

struct A 
{
	int a;
	char b;
	char c[10];
	char d;
};

int main()
{
	A aa;
	aa.a = 5;
	aa.b = 'a';
	aa.c = "hello";  //错误! 字符串数组复制不能用“=”,除非定义变量的时候。
	aa.d = 'b';

	return 0;
}

aa.c="hello";//表达式必须是可修改的左值


aa.c  是一个大小为10的字符数组(字符串)。字符串数组复制不能用“=”,除非定义变量的时候

示例:

定义变量的时候,用“="给字符数组赋值:
char str[12]="hello world";

另:数组名是常量,不可修改。数组名也就是指向数组在内存中起始地址的指针。

 

修改方法有以下几种:

1、使用 strcpy(aa.c, "hello"); --->拷贝6个字节(包括最后的'\0')到字符串数组aa.c.

2、用字符指针替代字符数组。

struct A 
{
	int a;
	char b;
	char * c; //修改成字符串指针形式
	char d;
};

3、使用string代替

struct A 
{
	int a;
	char b;
	string c; //使用string代替
	char d;
};

会初夏以下提示:

对结构体中字符数组赋值时,出现表达式必须是可修改的左值的问题。以及strcpy和memcp区别_第1张图片

 


strcpy和memcpy区别:

strcpy函数的原型是:char* strcpy(char* dest, const char* src);

void *memcpy( void *dest, const void *src, size_t count );

1、strcpy和memcpy都是标准C库函数。

2、strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符

3、memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制(例如字符数组、整型、结构体、类等。),因此用途更广。

char * strcpy(char * dest, const char * src) // 实现src到dest的复制
{

  if ((nullptr == src) || (nullptr == dest)) //判断参数src和dest的有效性
  {
      return nullptr;
  }

  char *strdest = dest;        //保存目标字符串的首地址

  while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下
   
   *strDest = '\0';  //会把'\0'复制过去

  return strdest;

}


void *memcpy(void *dst, const void *src, size_t size)
{
  if((nullptr == dst) || (nullptr == src)) //dst和src必须有效
    {
        return nullptr ;
    }

  char *tempdst = (char *)dst;   //保存dst首地址
  char *tempsrc = (char *)src;   //保存src首地址     

  while(size-- > 0)              //循环size次,复制src的值到dst中
    {
        *dst++ = *src++ ; 
    }

  return tempdst;
}

 

 

 

 

 

 

你可能感兴趣的:(C++)