我的代码是:
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;
}
所有“学生”都带有下划线,表示表达式必须是可修改的左值。我该如何解决这个问题?
人
typedef struct person
{
char names[20][10];
char sex[6][10];
int ages[10];
int month[10];
int day[10];
int year[10];
} 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;
不需要[10]
。您已经在 person student[10]
声明中拥有它,这是 [10]
的正确位置。删除无关的数组:
typedef struct person {
char name[20];
char sex[6];
int age;
int month;
int day;
int year;
} person;
字符串处理
此外,您的字符串不是null-terminated。在 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';
实际上,有一种方法可以更简单地分配给一个字符串,而不是一次分配一个字符。 strcpy 函数将一次性复制整个字符串:
strcpy(student[0].name, "Cami");
或者,最简单的选择是使用 C++ 中可用的字符串类。它使字符串处理比 C 操作字符数组的方式容易得多。使用字符串类,您的代码将如下所示:
// Modified struct declaration.
typedef struct person {
std::string name;
std::string sex;
int age;
// ...
} person;
// Modified assignment.
student[0].name = "Cami";
关于c++ - 如何修复此左值警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3293062/