Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修改此结构中的字符数组~>;C_C - Fatal编程技术网

如何修改此结构中的字符数组~>;C

如何修改此结构中的字符数组~>;C,c,C,好的,我有一个结构 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 contac

好的,我有一个结构

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.
}
任何帮助都会很好

strcpy(contact.firstName,"Herp");
您需要将字符串复制到字符数组(字符串)中

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

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

您的结构将为每个实例留出32字节的内存。
.firstName
以及其他
char[]
字段

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

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

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


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

如果要避免缓冲区溢出

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

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

我对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));

此表单将防止可能的堆栈溢出。您将永远无法向目标字符串复制超出其容量的字节。

是的,我忘记了main中的return语句。现在可以忽略它,因为它是一个示例代码@Binayakacharaborty方向正确,但实现不安全…@Alnitak:我就是这么说的,这一切都取决于上下文。例如,仅仅因为您使用了strncpy,并不意味着它是安全的。例如,如果您只是默默地截断字符串,这可能比某些上下文(例如:银行业)中的潜在崩溃产生更糟糕的影响。为什么所有的否决票?这是一个基本但非常合理的问题。哇,谢谢。还有,我只是想知道为什么我的问题被否决了这么多,因为当我搜索网站时,我发现没有任何东西对我所寻找的东西有帮助。@user2838我不在否决者之列,但是我相信这个问题被否决了,因为StackOverflow并不能代替C语言初学者的书。像这样的问题会被问很多次(在上周我已经多次看到几乎完全相同的问题)并在其他问题中占用屏幕空间,而不会给未来的用户带来切实的好处。我希望这个答案提到与将任意字符串压缩到32字节固定数组相关的安全问题。@SirDarius和我一样,你的意思是?;-)我补充了一点。我本来不知道,因为这显然是一个初学者的问题,弦的概念也需要理解——但我接受你的观点,这是一个很好的地方提及它,但我们不能让人们远离它的深层次!!再一次,现在我已经很清楚我一直在努力做什么。谢谢我们还应该指出,如果您的结构包含指针而不是字符数组,那么取消分配就会困难得多——特别是如果其中一些指针引用字符串常量而不是动态分配的内存,并且您没有记录哪些是哪个!一致使用
strdup
比复制字符串常量指针更安全。使用常量时应使用define“#define FIRST_NAME_LEN 32”。这样一来,你可以在一个地方更改它,然后它会在任何地方更新。如果使用数值常量,则需要到处更新它。如果你错过了一个,你就有一个bug。@ErikNedwidek:这只是一个简短的小代码片段,但是的,这是显而易见的:)谢谢你的剩余部分!