【发布时间】:2021-01-13 09:49:18
【问题描述】:
我有一个类似于以下定义的结构:
struct csv_headers {
char field1[256];
char field2[256];
};
然后在我的代码中,我有:
struct csv_headers fields;
strcpy(fields.field1, str_ary[0]);
strcpy(fields.field2, str_ary[1]);
str_ary[n] 是一些字符串。
这是否会像下面的代码一样导致未定义的行为?
char str[] = "some text";
strcpy(str, "text");
既然 strcpy 不应该用于字符串字面量?
如果是这样,将字符串复制到结构内声明的字符串中的公认方法是什么?我上面的代码示例使用-Wextra 编译时没有警告(假设我输入正确 - 我现在没有代码在我面前)。
我知道使用 strcpy 的潜在危险并且不想在这里讨论,这仅用于说明目的。我只想知道将字符串复制到包含字符串的结构中的公认方式。
【问题讨论】:
-
char str[] = "some text"; strcpy(str, "text");有什么问题?str是一个由 10 个char组成的数组,因此您可以将strcpy5char放入其中。 -
您不能将单个字符传递给
strcpy,所以是的,这是未定义的行为,因为strcpy(fields.field1, str_ary[0]);没有任何意义并且无法干净地编译。您的问题是为什么不能将char而不是char*传递给strcpy? -
在您的示例中,
str不是字符串文字,它是一个常规的char数组,它是strcpy的完全有效目标。 -
@Dai 不是。你应该同时使用。
-
如果
str_ary是char str_ary[n]然后strcpy(fields.field1, str_ary[0]);是错误的,不知道您在尝试什么,但strcpy(fields.field1, &str_ary[0]);会起作用,而不是您的使用