我从
开始memcpy(g->db_cmd,l->db.param_value.val,l->db.param_value.len);
其中包含值“function”但是我希望附加一个空字符,如“function'\ 0'”我试过了
memcpy(&g->db_cmd[l->db.param_value.len],0,1);
这会导致程序崩溃。我也尝试了memset
memset(&g->db_cmd[l->db.param_value.len],0,1);
这不起作用。有什么想法吗?
答案 0 :(得分:4)
g->db_cmd[l->db.param_value.len] = 0;
假设您已为此分配空间。
答案 1 :(得分:4)
首先,C(和C ++)不像Java,C#,PHP和其他人那样知道动态。当您在C中看到一个字符串时,该字符串的长度几乎是静态的。
为了使答案更简单,让我们重新定义您的变量:
g->db_cmd
将被称为dest
,l->db.param_value.val
将被称为src
和l->db.param_value.len
将被称为len
。您应该分配一个大小为len
的新字符串加一(对于额外的空值)。
分配新的dest
:
dest = calloc(sizeof(char), len + 1);
只要len
加1, calloc就会分配一个字符数组。在calloc()分配了数组之后,它用空值(或\ 0)填充它,因此你自动将dest
字符串附加一个空值。
接下来,使用strncpy将src
复制到dest
:
strncpy(dest, src, len);
要将其转换回您的变量名称:
g->db_cmd = calloc(sizeof(char), l->db.param_value.len + 1);
strncpy(g->db_cmd, l->db.param_value.val, l->db.param_value.len);
答案 2 :(得分:3)
如果您想要字符串复制语义,为什么不使用a string-copying function?
答案 3 :(得分:0)
默认情况下,字符串以空值终止
如果你想在结尾添加一个额外的NULL,你可以写“String \ 0”
或db_cmd[len]='\0'
答案 4 :(得分:0)
如果您要复制的源也包含NULL终止字符串,请使用
memcpy( g->db_cmd, l->db.param_value.val, l->db.param_value.len + 1 );
否则你必须自己添加终结器。
g->db_cmd[l->db.param_value.len] = '\0';
当然,您需要确保目的地有足够的空间容纳此角色。
答案 5 :(得分:0)
memcpy有两个指针和一个整数。在你说的崩溃行中,你传递一个指针和两个整数。代码不能取消引用第二个参数(0) 如果你真的想要使用memcpy,你必须有一个指向零
的指针char zero = 0;
memcpy(&g->db_cmd[l->db.param_value.len], &zero , 1);
但我真的建议使用pyroscope的答案。它更快,更清晰。