c++ - 如何修复此左值警告?

标签 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;
}

所有“学生”都带有下划线,表示表达式必须是可修改的左值。我该如何解决这个问题?

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/

相关文章:

c++ - switch 语句和对象隐式 int 转换

c++ - 对可变参数模板类型列表的每种类型进行操作的函数

java - 如何在不使用比较器的情况下对充满空值的数组进行排序?

c - 为什么我得到 : "error: assignment to expression with array type"

PHP - 从面包屑列表的多维关联数组返回父数组

c++ - 'delete' 在 clang 中完美编译时在 g++ 中抛出错误

c++ - glRotate 和我的矩阵::旋转

c++ - 在 C++ (C) 中使用全局范围对象(结构)是否可以?

javascript - 重新映射 JavaScript 数组

c++ - 使用 Char 数组的 ROT13 实现