将结构的第一个变量分配给另一个
assigning first variable of struct to another
我有 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?
问题是一个包含 5 个字符的数组少了一个来容纳一个字符串 "plane"
。您需要一个包含 6 个字符的数组(一个用于空终止符)。如果没有空终止符,当变量作为参数提供给 %s
转换说明符时,将发生越界访问(在搜索空终止符时),这将导致 undefined behaviour.
改变
char name[5];
至
char name[6];
如果您打算将 name
用作 字符串。
也就是说,要将一个结构变量的值复制到另一个相同类型的变量中,你只需要使用赋值运算符=
,如
struct point B = A;
至于在 C 中声明一个字符串,您必须考虑到最后一个元素始终是 [=12=]
(它是 NULL
ascii 字符)以便包含“平面”,您的数组应该很大“平面”的长度+1 (6, {'p','l','a','n','e','[=14=]'}
).
如果要使用指针:
只需将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: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
main.c:12:34: note: (near initialization for ‘B.name[0]’)
您不能将地址分配给数组,将 name
声明为指针或使用 strcpy
,如下所示。
此外,您的数组 name
应该有一个 space 用于 [=14=]
,因此将其声明为 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);
}
你的代码的问题是在这个声明中
struct point B = {A.a, A.b, A.name};
最后一个初始化器 A.name
具有用于初始化字符数组的指针类型 char *
。您不能用指针初始化数组。
你可以直接写
struct point B = A;
考虑到由于此初始化
struct point
{
int a, b;
char name[5];
} A = {3, 5, "plane"}, B;
字符数组 A.name
不包含字符串,因为数组中没有 space 作为字符串文字的终止零字符 '[=21=]'
。
因此,您不能在 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);
我有 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?
问题是一个包含 5 个字符的数组少了一个来容纳一个字符串 "plane"
。您需要一个包含 6 个字符的数组(一个用于空终止符)。如果没有空终止符,当变量作为参数提供给 %s
转换说明符时,将发生越界访问(在搜索空终止符时),这将导致 undefined behaviour.
改变
char name[5];
至
char name[6];
如果您打算将 name
用作 字符串。
也就是说,要将一个结构变量的值复制到另一个相同类型的变量中,你只需要使用赋值运算符=
,如
struct point B = A;
至于在 C 中声明一个字符串,您必须考虑到最后一个元素始终是 [=12=]
(它是 NULL
ascii 字符)以便包含“平面”,您的数组应该很大“平面”的长度+1 (6, {'p','l','a','n','e','[=14=]'}
).
如果要使用指针:
只需将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: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
main.c:12:34: note: (near initialization for ‘B.name[0]’)
您不能将地址分配给数组,将 name
声明为指针或使用 strcpy
,如下所示。
此外,您的数组 name
应该有一个 space 用于 [=14=]
,因此将其声明为 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);
}
你的代码的问题是在这个声明中
struct point B = {A.a, A.b, A.name};
最后一个初始化器 A.name
具有用于初始化字符数组的指针类型 char *
。您不能用指针初始化数组。
你可以直接写
struct point B = A;
考虑到由于此初始化
struct point
{
int a, b;
char name[5];
} A = {3, 5, "plane"}, B;
字符数组 A.name
不包含字符串,因为数组中没有 space 作为字符串文字的终止零字符 '[=21=]'
。
因此,您不能在 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);