struct person
{
char age [3];
char * name;
};
char nameBuf[20];
person Natasha;
person * p_person;
p_person = &Natasha;
Natasha.name = nameBuf;
createPerson (person * resultingPerson, int p_age, const char * p_name)
{
sprintf(resultingPerson->age, "%03d", p_age);
strncpy(resultingPerson->name, p_name, strlen(p_name));
}
createPerson (p_person, 29, "Chelsea");
此代码在调用 strncpy 时失败。我不能使用动态分配的内存。处理这个问题的最佳方法是什么?为什么在 name* 指向 nameBuf[20] 字符数组然后使用 strncpy 后这不起作用?
谢谢
最佳答案
首先,年龄只有 3 岁,而您正试图写入 4 个字节的 3 位数字和一个空值。此外,通常您的 strncpy 长度参数是目标的大小减 1,以便您有空间添加空值(如果源字符串较短,strncpy 将添加空值)。
#define NAMEBUFSIZ 20
char namebuf[NAMEBUFSIZ];
typedef struct person
{
char age [3];
char *name;
} person;
person Natasha;
person * p_person;
p_person = &Natasha;
p_person->name = namebuf;
createPerson (person * resultingPerson, int p_age, const char * p_name)
{
char tmpbuf[5];
snprintf(tmpbuf, sizeof(tmpbuf), "%03d", p_age);
memcpy(resultingPerson->age, tmpbuf, sizeof(resultingPerson->age));
resultingPerson->name[NAMEBUFSIZ-1] = '\0';
strncpy(resultingPerson->name, p_name, NAMEBUFSIZ-1);
}
createPerson (p_person, 29, "Chelsea");
但它仍然不干净。你能保证年龄是合理的,并且只传递短名称(19 个或更少的字符)吗?
注意:将 sprintf 更改为 snprintf,因为下面的评论是正确的,sprintf 非常不安全,正如您的代码示例所示
关于char * 在一个结构中,指向一个 char 数组,然后使用 strncpy。试图避免动态分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29054879/