如何修复此左值警告?

Sar*_*ah 4 c++ arrays

我的代码是:

void main() {
 person student[10];

 student[0].names[0] = 'C';
 student[0].names[1] = 'a';
 student[0].names[2] = 'm';
 student[0].names[3] = 'i';
 student[0].ages = 16;
 student[0].sex[0] = 'F';
 student[0].sex[1] = 'e';
 student[0].sex[2] = 'm';
 student[0].sex[3] = 'a';
 student[0].sex[4] = 'l';
 student[0].sex[5] = 'e';
 student[0].month = 8;
 student[0].day = 2;
 student[0].year = 1993;
}
Run Code Online (Sandbox Code Playgroud)

所有的"学生"都有下划线说,表达必须是可修改的左值.我怎样才能解决这个问题?

person

typedef struct person 
{ 
char names[20][10]; 
char sex[6][10]; 
int ages[10]; 
int month[10]; 
int day[10]; 
int year[10]; 
} person;
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 9

数组用法

你说你有:

typedef struct person {
    char names[20][10];
    char sex[6][10];
    int ages[10];
    int month[10];
    int day[10];
    int year[10];
} person;
Run Code Online (Sandbox Code Playgroud)

没有必要[10].你已经在person student[10]宣言中有了这个,这是适当的地方[10].删除无关的数组:

typedef struct person {
    char name[20];
    char sex[6];
    int age;
    int month;
    int day;
    int year;
} person;
Run Code Online (Sandbox Code Playgroud)

字符串处理

你的字符串也不是以null结尾的.在C字符串中,需要'\0'在末尾有一个额外的字符来指示字符串结尾的位置.例如,您的姓名分配应该是:

student[0].name[0] = 'C';
student[0].name[1] = 'a';
student[0].name[2] = 'm';
student[0].name[3] = 'i';
student[0].name[4] = '\0';
Run Code Online (Sandbox Code Playgroud)

实际上,有一种更简单的方法来分配字符串,而不是一次一个字符.该strcpy的功能将一气呵成复制整个字符串:

strcpy(student[0].name, "Cami");
Run Code Online (Sandbox Code Playgroud)

或者,最简单的选择是使用C++中可用的字符串类.它使字符串处理比操作字符数组的C方式更容易.使用字符串类,您的代码将如下所示:

// Modified struct declaration.
typedef struct person {
    std::string name;
    std::string sex;
    int         age;
    // ...
} person;

// Modified assignment.
student[0].name = "Cami";
Run Code Online (Sandbox Code Playgroud)

  • @Sarah如果您发现此答案最有帮助,您应该通过单击其左侧的复选标记来"接受"它. (2认同)