无论第一还是第二的内容,这是否都有效,还是需要特殊考虑(以 \0 或任何内容开头或结尾)?
您正在使用字符串函数,因此这些函数必须是正确的 C 字符串:即,它们必须以'\0'
字符结尾,并且字符串中不能有任何其他 NUL。
如果这些实际上是二进制数据而不是字符串,那么您不能使用像strlen
和这样的字符串函数sprintf
。我想我会为这两种不同的情况写两个不同的答案。
字符串
如果这些是正确的以 NUL 结尾的 C 字符串,则:
- 不要忘记为
'\0'
字符包含空格。
- 演员表
(u_char *)
是不必要的。
- 这甚至可以编译吗?第二个参数
snprintf
应该是要写入的字节数。
- 编译器还应该抱怨传递 a
u_char *
而不是 a char *
。
鉴于这一切,我将代码编写为:
size_t size = strlen(first) + strlen(second) + 1;
u_char *str = malloc(size);
if (str == NULL) {
/* handle error */
}
else {
snprintf((char *) str, size, "%s%s", first, second);
}
实际上,在这种情况下,您可以选择更简单sprintf
的,因为您知道字符串总是合适的。
sprintf((char *) str, "%s%s", first, second);
二进制数据
如果这些是二进制数据,那么您不能使用像strlen
和这样的字符串函数sprintf
。您必须重写代码以避免它们。
没有自动方法可以确定字节数组的长度。这是您必须自己跟踪的信息。
size_t firstSize = /* ??? */;
size_t secondSize = /* ??? */;
u_char *newStorage = malloc(firstSize + secondSize);
memcpy
要在 use或周围复制任意字节memmove
。
if (newStorage == NULL) {
/* handle error */
}
else {
memcpy(newStorage, first, firstSize);
memcpy(newStorage + firstSize, second, secondSize);
}