C 将一个值从一个结构集中营复制到另一个结构但数据类型相同
所以我有一个结构,我用该结构数据类型初始化了一个变量C 将一个值从一个结构集中营复制到另一个结构但数据类型相同,c,struct,C,Struct,所以我有一个结构,我用该结构数据类型初始化了一个变量a,然后输入了一些值。但是现在我需要将这些值放入另一个具有相同结构数据类型的变量B。我怎样才能做到这一点 struct s_Especialidade{ int id; char nome[60]; char descricao[60]; struct s_Especialidade *proximo; }; typedef struct s_Especialidade Especialidade; P
a
,然后输入了一些值。但是现在我需要将这些值放入另一个具有相同结构数据类型的变量B
。我怎样才能做到这一点
struct s_Especialidade{
int id;
char nome[60];
char descricao[60];
struct s_Especialidade *proximo;
};
typedef struct s_Especialidade Especialidade;
PESPECIALIDADE p, *array;
p->nome = &array[i]->nome; //THIS LINE GIVES THE ERROR
因为它是一个字符数组,所以需要复制数组中的每个元素
strcpy(p->nome,array[i]->nome)
可以做到这一点,但为了获得额外的安全性,请查看strncpy
,您可以在其中设置最大长度以避免溢出。尝试以下方法:
memcpy( p->nome, array[i].nome, 60 * sizeof(char) );
或者泛化类型,选择p->nome
数组中使用的类型:
memcpy( p->nome, array[i].nome, 60 * sizeof(*(p->nome)) );
这是将一个数组复制到另一个数组(不仅仅是字符串)的通用且安全的方法。要扩展答案,我建议使用
strcpy()
,并使用定义的长度确保始终使用相同的值
#define NOME_LENGTH 60
struct s_Especialidade{
int id;
char nome[NOME_LENGTH];
char descricao[60];
struct s_Especialidade *proximo;
};
typedef struct s_Especialidade Especialidade;
PESPECIALIDADE p, *array;
memcpy(p->nome, array[i]->nome, NOME_LENGTH);
在考虑分配任务时,事情变得更加复杂,但是,在一个示例程序中:
struct stuff {
char buf[2];
};
int main() {
struct stuff a;
memcpy(a.buf, "aa", 2); // *Edit: "aa" is a bad example as it
// actually becomes at compilation 3 bytes long
// {'a','a','\0'} as noted in the comments
struct stuff b;
b.buf = a.buf; // *Edit: For illustrative purposes, an assignment
// between two char[2] members is not correct and
// does not compile.
}
编译将删除错误error:为b.buf=a.buf
行从类型“char*”
分配给类型“char[2]”时出现的不兼容类型
指针和数组的主题已经在其他地方讨论过了
*编辑:如注释中所述,在上述代码中,如果不是
b.buf=a.buf代码>结构赋值ntb=a代码>完成后,将正确复制内部成员。这是因为结构到结构的赋值实际上是memcpy(&b,&a,sizeof(b))
()使用strcpy
或strncpy
charbuf[3]因为字符串“aa”
以'\0'
结尾!您有3个字符要复制。@Golgauth“aa”以'\0'
结尾与此无关,因为只有2个字符要从中复制,而目标只有2个字符长。buf不会被NUL终止,但那是另一回事。“编译会导致错误”--a=b代码>而不是。。。这很好。@JimBalter是的,我知道那只是为了教学目的。以防有人读到这页并试图从中操纵C字符串。我现在不忙,所以…;-)sizeof(char)
始终为1,因此乘以它将一无所获。如果你想说的是一般性的,那就用60*sizeof*p->nome
你说得很对,但我还是想让初学者清楚一点。编辑。谢谢