如何解决将结构的第一个变量分配给另一个
我有 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 举报,一经查实,本站将立刻删除。