C 如何设置结构的字符串属性?
我的代码如下:C 如何设置结构的字符串属性?,c,struct,C,Struct,我的代码如下: #include <stdio.h> struct MyData { int id; char msg[255]; }; int main ( int argc, const char * argv[] ) { struct MyData item; item.id = 3; item.msg = "something else"; printf("Msg: %d", item.msg); return 0
#include <stdio.h>
struct MyData {
int id;
char msg[255];
};
int main ( int argc, const char * argv[] ) {
struct MyData item;
item.id = 3;
item.msg = "something else";
printf("Msg: %d", item.msg);
return 0;
}
#包括
结构MyData{
int-id;
char-msg[255];
};
int main(int argc,const char*argv[]{
结构MyData项;
项目id=3;
item.msg=“其他内容”;
printf(“消息:%d”,item.Msg);
返回0;
}
我在第行的赋值中遇到不兼容类型的错误:
item.msg=“其他内容”
我不担心设置id属性,但是我不知道如何设置string属性“msg”。知道我做错了什么吗?使用
strncpy()
将字符串复制到字符缓冲区。不要忘记将\0
赋给最后一个元素以防万一。在C中,值上下文中数组的名称与指针相同。也就是说,如果我有一个“类型数组T
”,那么它与值上下文中的“类型指针T
”相同。什么是价值语境?它基本上是每当使用对象的值时。当您将对象的名称传递给函数、使用赋值右侧的名称等时,会发生这种情况。但在上述情况下,在表达式的LHS上,它不是在值上下文中使用,而是在“对象上下文”中使用,因为您不是在“读”数组对象的值,而是在赋值给它
换句话说,如果你有一个指针(char*msg;
),你可以说msg=“其他”代码>,它会工作,因为您正在将指针msg
设置为指向包含(只读)字符串“其他东西”
的位置。当你有charmsg[255]代码>,您不能说msg=“其他”
因为msg
已经分配了一个固定的空间,所以说“这个空间现在指向另一个包含我的字符串的空间”是没有意义的。您现在可以做的最好的事情是从msg
使用的位置的另一个位置复制字符串msg
用于此处的对象上下文,因此不会“衰减”到指针
有关差异的详细解释,请参见
解决方案是将msg
作为指针(如果您的字符串在编译时都是已知的,或者如果您不介意动态分配内存),或者使用strcpy()
/strncpy()
(我个人不喜欢strncpy()
,因为它可能不为null,从而终止目标)。尝试使用strcpy(3);由于字符串本身不是字符串,而是字符数组,因此(通常)您可能无法以这种方式访问“字符串”
干杯
~knubze请注意,我个人不喜欢strncpy()
而不是strcpy()
,因为1)它会写入目标缓冲区中的每个字节,并在结尾用零填充;2)如果目标小于源,则必须在结尾手动写入0
,在这种情况下,大多数情况下,一个更好的解决方案是从一个更大的目标缓冲区开始。strlcpy是您的朋友。我知道strlcpy()
,但它不是ANSI/ISO C,甚至不是POSIX。“%d”代表整数。“%s”代表字符串(char*),所以在使用printf时要小心。如果dest是256字节:sprintf(dest,%.255s”,data)代码>是可移植的,没有gotchas。作为参考…因为字符串是一个文本,从C99开始,您可以说struct MyData item={3,“something”};item=(structmydata){3,“其他东西”}代码>。不过,AFAIK仅适用于数组和字符串文本。