0

好的,我有一个结构

typedef struct contact {

    char firstName[32];
    char lastName[32];
    char address[100];
    char city[32];
    char state[32];
    char zipcode[10];

} Contact;

我需要使 firstName 的值等于“Herp”
我试过这样的事情:

int main(void) { 
    Contact contact;
    contact.firstName = "Herp"; // I also tried the following line of code:
    contact.firstName[] = "Herp"; // This doesn't work, and when I add a 0 to where the array needs to point, I get a syntax error.
}

任何帮助都会很棒。

4

4 回答 4

4

.firstName您的结构将为每个实例留出 32 个字节的内存,对于其他char[]字段也是如此。

char[32]缓冲区可以像char*指针变量一样被读取,但如果你写它contact.firstName = "Herp",就好像你试图重新分配字段的内存地址。但是你不能这样做 - 该缓冲区的地址相对于内存中整个结构的开始是固定的。

因此,您必须将所需数据从原始字符串复制到缓冲区中。

在有限的情况下,您可以使用strcpy它,但理想情况下,您应该使用它strncpy来确保您不会从一个字段溢出到另一个字段。

NUL如果原始字符串的长度超过 32个字符,请注意结果缓冲区中没有终止符的可能性。

于 2013-10-14T17:45:21.140 回答
3

我投票赞成 noelicus 的回答,但我觉得它需要更进一步。

typedef struct contact {

    char* firstName;
    char* lastName;
    char* address;
    char* city;
    char* state;
    char* zipcode;

} Contact;

然后这将起作用:

contact.firstName = "Herp";

原因是指针将被设置为指向包含字符串的分配空间。

在您的情况下,字符串已经被分配,您需要复制常量字符串(C 字符串是不可变的)。我会说更好的方法是:

strncpy(contact.firstName, "Herp", sizeof(contact.firstName));

这种形式将防止可能的堆栈溢出。您将永远无法将更多的字节复制到目标字符串,而不是它可以容纳的。

于 2013-10-14T17:53:37.327 回答
2
strcpy(contact.firstName,"Herp");

您需要将字符串复制到字符数组(字符串)中。

使用方括号将访问字符串中的一个字符,例如contact.firstName[0]访问第一个字符。

编辑: strcpy是开始和学习字符串的好地方,但在实际系统中并不安全,因为它不会检查您要复制到的缓冲区中是否有空间。如果您想阅读有关安全字符串处理的更多信息,请尝试strcpy_s等 - 为了安全起见,需要为函数提供最大数组/字符串大小,例如使用ARRAYSIZE 宏

于 2013-10-14T17:42:13.460 回答
0

如果你想避免缓冲区溢出

strncpy(contact.firstName,"Herp",32);

确保您作为“Herp”传递的值不能超过 31 个字符,如 Alnitak 所述:)

于 2013-10-14T17:47:06.573 回答