如何设置结构的字符串属性?

时间:2010-01-01 08:31:22

标签: 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;
}

我在行上分配了不兼容类型的错误: item.msg =“别的东西”;

我无需担心设置id属性,但我无法弄清楚如何设置字符串属性“msg”。我有什么想法吗?

3 个答案:

答案 0 :(得分:4)

使用strncpy()将字符串复制到字符缓冲区中。不要忘记将\0分配给最后一个元素以防万一。

答案 1 :(得分:2)

在C中,值上下文中的数组名称与指针相同。也就是说,如果我有一个“T类型的数组”,那么它与值上下文中的“指向类型T的指针”相同。什么是价值背景?基本上只要使用对象的。当您将对象的名称传递给函数,使用赋值右侧的名称等时会发生这种情况。但在上面的情况下,在表达式的LHS上,它不会在值上下文中使用但是“对象上下文”,因为您没有“读取”数组对象的值,而是指定给它。

换句话说,如果你有一个指针(char *msg;),你可以说msg = "something else";,它会起作用,因为你将指针msg设置为指向该位置包含(只读)字符串"something else"。当你有char msg[255];时,你不能说msg = "something else";,因为msg已经分配了一个固定的空间,并且说“这个空间现在指向另一个空间,其中包含我的字符串“。您现在可以做的最好的事情是从msg使用的位置的其他位置复制字符串。 msg对象上下文中使用,因此不会“衰减”到指针。

有关差异的绝佳解释,请参阅C for Smarties: Analyzing expressions

解决方案是使msg指针(如果你的字符串在编译时都是已知的,或者如果你不介意动态分配内存),或者使用strcpy() / { {1}}(我个人不喜欢strncpy(),因为它可能不会终止目的地。)

答案 2 :(得分:0)

尝试使用strcpy(3);因为字符串本身不是字符串而是字符数组 - 你可能不会(通常)以这种方式访问​​“字符串”。

干杯 〜knubbze