我的代码如下:
#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”。我有什么想法吗?
答案 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