表达式必须是可修改的左值(字符数组)

Posted

技术标签:

【中文标题】表达式必须是可修改的左值(字符数组)【英文标题】:Expression must be Modifiable lvalue (char array) 【发布时间】:2016-05-04 01:10:06 【问题描述】:

我将我的结构定义为:

struct taxPayer
  char name[25];
  long int socialSecNum;
  float taxRate;
  float income;
  float taxes; 
;

我的主要功能包含:

taxPayer citizen1, citizen2;

citizen1.name = "Tim McGuiness";
citizen1.socialSecNum = 255871234;
citizen1.taxRate = 0.35;

citizen2.name = "John Kane";
citizen2.socialSecNum = 278990582;
citizen2.taxRate = 0.29;

编译后在citizen1.name = "Tim McGuiness";citzen2.name = "John Kane"; 上给我一个错误(C3863 数组类型char[25] 不可赋值,表达式必须是可修改的左值)

如何消除此错误并将citizen1.name 设置为一个名称并将citizen2.name 设置为另一个名称?

【问题讨论】:

只需将char name[25] 更改为const char*。或使用std::string 完美,将char name[25] 切换为char *name 并且工作正常。 @ZackSloan 切换到char* name 并不像您想象的那样工作。您需要为它分配内存,否则它似乎可以工作,但是您遇到未定义的行为并且代码很可能会崩溃。如果可能,坚持std::string,所有这些噩梦都会结束。 啊,我不是说切换到char*,而是说const char*。巨大差距。这只有在编译时知道name 时才有意义。如果要在运行时输入name,则使用std::string 或者,如果你真的想要,你可以使用char*作为taxPayer::name的类型,结合strdup,它会为你处理内存分配:citizen1.name = strdup("Tim McGuiness");。但同样,如果您编写 C++,请坚持使用 C++。 【参考方案1】:

您不能分配给数组。你可以做的是要么使用std::string,要么使用std::strcpy/std::strncpy,比如

std::strncpy(citizen1.name,"Tim McGuiness", sizeof(taxPayer::name));

由于您使用 C++,我建议您使用 std::string

struct taxPayer

    std::string name;
    // the rest
;

然后您可以像在代码中那样简单地分配给它

citizen1.name = "Tim McGuiness";

【讨论】:

确保strncpy接收到最大允许长度的副本,即name[25]数组的长度。否则,超过 25 个字符的名称(例如 "William Longhorn Emil Wastekovich")会产生问题。 @Jens 当然,这就是为什么我认为 OP 应该使用 std::string (如果使用 C++ 而不是 C),否则当然 strncpy 最大长度是安全代码的方式。 如果这是一个选项,那么可以。如果不是并且 OP 必须使用数组,则需要额外注意。 修改为 strncpy 只是为了让 OP 避免时髦的缓冲区溢出 ;)【参考方案2】:

在c中,数组只能在初始化期间赋值,citizen1.name是char类型的数组。为了解决你的问题,你可以使用这个:

strcpy(citizen1.name, "Tim McGuiness");

或:

memcpy(citizen1.name, "Tim McGuiness", strlen("Tim McGuiness"));
citizen1.name[strlen("Tim McGuiness") + 1] = '\0';

【讨论】:

【参考方案3】:

我做了一些研究,也许有点晚了,但它可能对这里的人有所帮助。

#include <iostream>
#include <string.h>
using namespace std;

int main() 
int i, j;

char cuvinte[5][10] =  "a", "b", "c",
                        "da", "e" ;
char temp[10];
int lungime = sizeof(cuvinte) / sizeof(cuvinte[0]);

for (i = 0; i < lungime - 1; i++) 
    for (j = 0; j < lungime - 1; j++) 
        if (strcmp(cuvinte[j], cuvinte[j+1]) < 0) 
            strcpy_s(temp, cuvinte[j]);
            strcpy_s(cuvinte[j],cuvinte[j+1]);
            strcpy_s(cuvinte[j+1],temp);
        
    


for (i = 0; i < lungime;i++) 
    cout << cuvinte[i] << " ";



system("pause");

【讨论】:

以上是关于表达式必须是可修改的左值(字符数组)的主要内容,如果未能解决你的问题,请参考以下文章

表达式必须是结构指针上的可修改左值

C 错误:表达式必须是可修改的左值

为啥我得到的表达式必须是可修改的左值?

指向函数指针的指针 - 表达式必须是可修改的左值

错误:表达式必须是可修改的左值

C++ 表达式必须是可修改的左值