gpt4 book ai didi

与 memcpy 连接

转载 作者:太空狗 更新时间:2023-10-29 15:20:35 24 4
gpt4 key购买 nike

我正在尝试使用 memcpy 将两个字符串相加。第一个 memcpy 确实包含我需要的数据。然而,第二个并没有增加。知道为什么吗?

if (strlen(g->db_cmd) < MAX_DB_CMDS )
{
memcpy(&g->db_cmd[strlen(g->db_cmd)],l->db.param_value.val,strlen(l->db.param_value.val));
memcpy(&g->db_cmd[strlen(g->db_cmd)],l->del_const,strlen(l->del_const));
g->cmd_ctr++;
}

最佳答案

size_t len = strlen(l->db.param_value.val);

memcpy(g->db_cmd, l->db.param_value.val, len);
memcpy(g->db_cmd + len, l->del_const, strlen(l->del_cost)+1);

这会给您带来以下好处:

  • 减少对 strlen 的冗余调用。其中每一个都必须遍历字符串,因此最好尽量减少这些调用。
  • 第二个 memcpy 需要实际追加,而不是替换。因此第一个参数必须与之前的调用不同。
  • 注意第二个 memcpy 的第三个参数中的 +1。那是针对 NUL 终止符的。

我也不确定您的 if 语句是否有意义。也许更明智的做法是确保 g->db_cmd 有足够的空间容纳您要复制的内容。您可以通过 sizeof(如果 db_cmd 是一个字符数组)或通过跟踪您的堆分配有多大(如果 db_cmd 是通过 malloc 获得)。所以也许最有意义的是:

size_t param_value_len = strlen(l->db.param_value.val),
del_const_len = strlen(l->del_const);

// Assumption is that db_cmd is a char array and hence sizeof(db_cmd) makes sense.
// If db_cmd is a heap allocation, replace the sizeof() with how many bytes you
// asked malloc for.
//
if (param_value_len + del_const_len < sizeof(g->db_cmd))
{
memcpy(g->db_cmd, l->db.param_value.val, param_value_len);
memcpy(g->db_cmd + param_value_len, l->del_const, del_const_len + 1);
}
else
{
// TODO: your buffer is not big enough. handle that.
}

关于与 memcpy 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6931193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com