微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将结构的第一个变量分配给另一个

如何解决将结构的第一个变量分配给另一个

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

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 中声明一个字符串,您必须考虑最后一个元素始终是 \0(它是 NULL ascii 字符),以便包含“平面”,您的数组应该是大长度“飞机”+1(6,{'p','l','a','n','e','\0'})。


如果你想使用指针:

只需将 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.name}; 替换为 B = A;

#include <stdio.h>

struct point
{
    int a,B;

int main(){
    //struct point B = {A.a,A.name};
    B = A;
    printf("%d %d %s",B.a,B.b,B.name);
}
,

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

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

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

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

int main(){
    struct point B =  {A.a,A.b};//,A.name};
    
    strcpy(B.name,A.name);
    
    printf("%d %d %s",B.name);
}
,

问题是一个包含 5 个字符的数组是一到少来保存字符串 "plane"。您需要一个包含 6 个字符的数组(一个用于空终止符)。如果没有那个空终止符,当变量作为参数提供给 %s 转换说明符时,会发生越界访问(寻找空终止符),这将导致 undefined behaviour

改变

char name[5];

char name[6];

如果您打算使用 name 作为字符串

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

 struct point B = A;
,

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

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

最后一个初始化器 A.name 具有用于初始化字符数组的指针类型 char *。不能用指针初始化数组。

你可以直接写

struct point B = A;

考虑到由于这个初始化

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

字符数组 A.name 不包含字符串,因为数组中没有空间用于字符串文字的终止零字符 '\0'

因此,您不能在 %s

的此调用中使用格式字符串 printf
printf("%d %d %s",B.name);

相反,你可以写

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

那是你的程序看起来像

#include <stdio.h>

struct point
{
    int a,B;

int main( void ){
    struct point B = A;
    printf("%d %d %.*s",B.name);
}

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

struct point
{
    int a,B;

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

调用
printf("%d %d %s",B.name);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。