Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何设置结构的字符串属性?_C_Struct - Fatal编程技术网

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仅适用于数组和字符串文本。