【问题标题】:How do I set a string property of a struct?如何设置结构的字符串属性?
【发布时间】:2010-01-01 08:31:22
【问题描述】:

我的代码如下:

#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”。任何想法我做错了什么?

【问题讨论】:

  • 供参考...由于字符串是文字,从 C99 开始,您可以说 struct MyData item = { 3, "something" }; item = (struct MyData) { 3, "something else" };。不过,AFAIK 仅适用于数组和字符串文字。

标签: c struct


【解决方案1】:

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

【讨论】:

  • 请注意,我个人不喜欢 strncpy() 而不是 strcpy(),因为 1) 它写入目标缓冲区中的每个字节,最后用零填充,2) 如果目标小于源,必须在末尾手动写入0,在这种情况下,大多数情况下更好的解决方案是一开始就拥有更大的目标缓冲区。
  • strlcpy 是你的朋友。谷歌一下。
  • 我知道 strlcpy(),但它不是 ANSI/ISO C。它甚至不是 POSIX。
  • "%d" 用于整数。 "%s" 用于字符串(char*'s),所以在使用 printf 时要小心。
  • 如果 dest 是 256 字节:sprintf (dest,"%.255s",data); 是可移植的并且没有陷阱。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    干杯 ~knubbze

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多