将结构的第一个变量赋值给另一个



我有结构点,它有两个变量,我不知道如何将字符串从一个分配到另一个。我还不熟悉指针,所以我不知道是否应该使用它们。

struct point
{
int a, b;
char name[5];
} A = {3, 5, "plane"}, B;
int main(){
struct point B = {A.a, A.b, A.name};
printf("%d %d %s", B.a, B.b, B.name);
}

输出为:3 5♀.如何将字符串A分配给B?

要在C中声明一个字符串,必须考虑最后一个元素始终是(它是NULLascii字符(,以便包含"平面";你的阵列应该是大长度的";平面"+1(6,{'p','l','a','n','e',''}(。


如果要使用指针:

只需将B声明为结构点指针(*B(,然后将其指向A,就可以打印出a的值,只需要将B指向它们即可。

#include <stdio.h>
struct point
{
int a, b;
char name[6];
} A = {3, 5, "plane"}, *B;
int main(){
//struct point B = {A.a, A.b, A.name};
B = &A;
printf("%d %d %s", B->a, B->b, B->name);
}

无指针:

您只需将struct point B = {A.a, A.b, A.name};替换为B = A;即可。

#include <stdio.h>
struct point
{
int a, b;
char name[6];
} A = {3, 5, "plane"}, B;
int main(){
//struct point B = {A.a, A.b, A.name};
B = A;
printf("%d %d %s", B.a, B.b, B.name);
}

我在运行这个程序时收到了这个警告

main.c:12:34:警告:初始化从指针生成整数而不进行强制转换[-Wint转换]
main.c12:34:注意:(接近"B.name[0]"的初始化(

您不能将地址分配给数组、将name声明为指针或使用strcpy,如下所示。

另外,您的数组name应该有一个用于的空间,因此将其声明为char name[6];

int main(){
struct point B =  {A.a, A.b};//, A.name};

strcpy(B.name,A.name);

printf("%d %d %s", B.a, B.b, B.name);
}

问题是一个由5个字符组成的数组容纳一个字符串"plane"的数量是一到少。您需要一个包含6个字符的数组(其中一个字符表示null终止符(。如果没有该null终止符,当变量作为参数提供给%s转换说明符时,将发生越界访问(搜索null终止符(,这将导致未定义的行为。

更改

char name[5];

char name[6];

如果您打算将name用作字符串

也就是说,要将一个结构变量值复制到另一个相同类型的变量,只需要使用赋值运算符=,如

struct point B = A;

您的代码的问题是在这个声明中

struct point B = {A.a, A.b, A.name};

最后一个初始化器CCD_ 18具有用于初始化字符数组的指针类型CCD_。不能使用指针初始化数组。

你可以写

struct point B = A;

考虑到由于此初始化

struct point
{
int a, b;
char name[5];
} A = {3, 5, "plane"}, B;

字符数组CCD_ 20不包含字符串,因为数组中没有用于字符串文字的终止零字符CCD_。

因此,您可能不会在printf的调用中使用格式字符串%s

printf("%d %d %s", B.a, B.b, B.name);

相反,你可以写

printf("%d %d %.*s", B.a, B.b, ( int )sizeof( B.name ), B.name);

这就是你的程序可以看起来像

#include <stdio.h>
struct point
{
int a, b;
char name[5];
} A = {3, 5, "plane"}, B;
int main( void ){
struct point B = A;
printf("%d %d %.*s", B.a, B.b, ( int )sizeof( B.name ),B.name);
}

如果您希望字符数组name包含一个字符串,那么您需要将其大小至少再放大一个字符,如

struct point
{
int a, b;
char name[6];
} A = {3, 5, "plane"}, B;

在这种情况下,您可以使用以下printf调用

printf("%d %d %s", B.a, B.b, B.name);

相关内容

  • 没有找到相关文章

最新更新