在C语言中为记录数组赋值

在C语言中为记录数组赋值,c,C,我有以下问题。对于家庭作业,我应该为5个学生创建一个记录“student”的堆数组,然后分配一些值(名称等)。 现在,当我尝试像以前那样给记录赋值时,我得到了一个“expression expected before{”错误 但是当我尝试分配一个值时,例如 students[0].hauptfach = "Informatik"; 程序编译 我做错了什么 提前感谢, D.您尚未显示结构定义,但我希望字符串是一个最大大小的char数组 要分配字符串,需要使用strncpy。查找该函数 基本上,假

我有以下问题。对于家庭作业,我应该为5个学生创建一个记录“student”的堆数组,然后分配一些值(名称等)。 现在,当我尝试像以前那样给记录赋值时,我得到了一个“expression expected before{”错误

但是当我尝试分配一个值时,例如

students[0].hauptfach = "Informatik";
程序编译

我做错了什么

提前感谢,


D.

您尚未显示结构定义,但我希望字符串是一个最大大小的
char
数组

要分配字符串,需要使用
strncpy
。查找该函数

基本上,假设
hauptfach
成员的长度为
MAX_LEN+1
个字符:

strncpy( students[0].hauptfach, "Informatik", MAX_LEN+1 );
students[0].hauptfach[MAX_LEN] = 0;  // Force termination if string truncated.
哦,对不起,我误解了你的问题。上面的说法可能仍然成立

不能在这样的结构上复制。必须在数组定义处对其进行初始化:

struct mystruct students[5]  = {
  {"Info", "Max Becker", 2781356},
  {"Soziologie", "Peter Hartz", 6666666},
  {"Hurensohnologie", "Huss Hodn", 0221567},
  {"Info", "Tomasz Kowalski", 73612723},
  {"Info", "Kevin Mueller", 712768329}
};
或者,您可以如图所示单独指定字段。另一个选项是,您可以通过初始化单个实例,然后按如下方式复制来替换整个数组元素:

struct mystruct temp = {"Soziologie", "Peter Hartz", 6666666};
students[0] = temp;

您还没有显示结构定义,但我希望字符串是一个最大大小的
char
数组

要分配字符串,需要使用
strncpy
。查找该函数

基本上,假设
hauptfach
成员的长度为
MAX_LEN+1
个字符:

strncpy( students[0].hauptfach, "Informatik", MAX_LEN+1 );
students[0].hauptfach[MAX_LEN] = 0;  // Force termination if string truncated.
哦,对不起,我误解了你的问题。上面的说法可能仍然成立

不能在这样的结构上复制。必须在数组定义处对其进行初始化:

struct mystruct students[5]  = {
  {"Info", "Max Becker", 2781356},
  {"Soziologie", "Peter Hartz", 6666666},
  {"Hurensohnologie", "Huss Hodn", 0221567},
  {"Info", "Tomasz Kowalski", 73612723},
  {"Info", "Kevin Mueller", 712768329}
};
或者,您可以如图所示单独指定字段。另一个选项是,您可以通过初始化单个实例,然后按如下方式复制来替换整个数组元素:

struct mystruct temp = {"Soziologie", "Peter Hartz", 6666666};
students[0] = temp;

这两种说法并不完全一致:

1 students = malloc(5*sizeof(student));
2 students[0] = {"Info", "Max Becker", 2781356};
(1) 表示希望在运行时动态分配内存


(2) 表示您希望在编译时将列出的值分配给固定地址。遗憾的是,编译器无法提前知道
学生[0]
的地址,因此无法执行您希望的操作

我建议您创建一个助手函数:

void initstudent(student *s, const char hf[], const char name[], int matnr){
  strncpy(s->hauptfach, hf, MAXLEN);
  strncpy(s->name, name, MAXLEN);
  s->matnr=matnr;
}

然后将这一点应用到你的每个学生身上。

这两种说法并不完全一致:

1 students = malloc(5*sizeof(student));
2 students[0] = {"Info", "Max Becker", 2781356};
(1) 表示希望在运行时动态分配内存


(2) 表示您希望在编译时将列出的值分配给固定地址。遗憾的是,编译器无法提前知道
学生[0]
的地址,因此无法执行您希望的操作

我建议您创建一个助手函数:

void initstudent(student *s, const char hf[], const char name[], int matnr){
  strncpy(s->hauptfach, hf, MAXLEN);
  strncpy(s->name, name, MAXLEN);
  s->matnr=matnr;
}

然后把这个应用到你的每个学生身上。

非常感谢。但是我现在应该在哪里使用malloc()呢?作业是关于堆的东西……哦,天哪,我误读了两遍(错过了
malloc
)。在这种情况下,使用我的单个结构赋值方法。没有简单的方法。另一个选项是创建一个函数,将所有数据传递到:
set\u record(结构记录*,常量字符*主题,常量字符*名称,未签名的学生id)
。哦,我看到Richard的回答中建议了这种方法。再次感谢。我会尝试一下,尽管我很确定有更简单的想法,因为这是我们关于C的第三次讲座,我们作业的总体设计似乎只是让我们使用malloc(),free()通过将指针输入到*.c文件并编译它来获取一些指针信息。还有什么比必须将指针传递到函数中进行初始化更好的学习方法呢…?我想这就是目的。那些长期使用指针的人(一个字段一个字段地填充所有记录)将了解那些有远见的人编写函数的重构。StrncPy不给字符串赋值;它分配给固定宽度字段。不能保证目的地包含字符串。另外,您的StrncPy代码看起来晦涩难懂。请考虑<代码> StrncPy(学生[ 0 ]。HuptfFAh,“Detralk”,Siges of Sub(0)]。.hauptfach-1);学生[0]。hauptfach[sizeof students[0]。hauptfach-1]='\0';删除预处理器定义并使代码更清晰。非常感谢。但是我现在应该在哪里使用malloc()?家庭作业是关于堆的……哦,天哪,我误读了两次(错过了
malloc
)。在这种情况下,使用我的单个结构赋值方法。没有简单的方法。另一个选项是创建一个函数,将所有数据传递到:
set\u record(结构记录*,常量字符*主题,常量字符*名称,未签名的学生id)
。哦,我看到Richard的回答中建议了这种方法。再次感谢。我会尝试一下,尽管我很确定有更简单的想法,因为这是我们关于C的第三次讲座,我们作业的总体设计似乎只是让我们使用malloc(),free()通过将指针输入到*.c文件并编译它来获取一些指针信息。还有什么比必须将指针传递到函数中进行初始化更好的学习方法呢…?我想这就是目的。那些长期使用指针的人(一个字段一个字段地填充所有记录)将了解那些有远见的人编写函数的重构。StrncPy不给字符串赋值;它分配给固定宽度字段。不能保证目的地包含字符串。另外,您的StrncPy代码看起来晦涩难懂。请考虑<代码> StrncPy(学生[ 0 ]。HuptfFAh,“Detralk”,Siges of Sub(0)]。.hauptfach-1);students[0]。hauptfach[sizeof students[0]。hauptfach-1]='\0';以删除预处理器定义并使代码更清晰。谢谢,但我想这不是我应该做的。作业只是说“创建堆数组”students“对于5个学生,然后用5个学生填充数组。我们应该从:学生*学生”开始。不幸的是,编译器无法知道