我有一个 char buf [x] , int s 和 void * data 。
我想从 buf 中将 s 的字符串写入 data 。
我该怎么做?
提前致谢。
答案 0 :(得分:4)
假设
data
; 首先,您需要在data
中分配内存。不要忘记字符串末尾的0
字节的空间。
data = malloc(s+1);
if (data == NULL) {
... /*out-of-memory handler*/
}
假设malloc
成功,您现在可以复制字节。
修改强>:
正如caf所指出的,这项工作的最佳功能是strncat
。(它完全可移植,属于C89。)它附加到目标字符串,因此安排目的地预先成为空字符串:
*(char*)data = 0;
strncat(data, buf, s);
其他劣等的可能性,在此作为相关功能的例子:
如果你有strlcpy
(这不是标准的C,但在现代Unix系统中很常见;有公共域实现在附近):
strlcpy(data, buf, s+1);
如果您知道源字符串中至少包含s
个字符,则可以使用memcpy
:
memcpy(data, buf, s);
((char *)data)[s + 1] = 0;
否则,您可以先计算源字符串的长度:
size_t bytes_to_copy = strlen(buf);
if (bytes_to_copy > s) bytes_to_copy = s;
memcpy(data, buf, bytes_to_copy);
((char*)data)[s+1] = 0;
或者您可以使用strncpy
,但如果源字符串的实际长度远小于s
,则效率很低:
strncpy(data, buf, s);
((char*)data)[s+1] = 0;
答案 1 :(得分:3)
如果未分配data
:
char buf[] = "mybuffer";
void *data = malloc(strlen(buf)+1);
strcpy((char*)data,buf);
实际上,如果真的要定义数据,你也可以
char buf[] = "mybuffer";
void *data= (void*)strdup(buf);
答案 2 :(得分:2)
memcpy(data, buf, s);
这假设您在数据中有足够的空间(并且在buf中)。
根据您正在做的事情(您没有说,但确实说您正在复制字符串),如果您尚未复制null,则可能需要在新复制的字符串末尾添加null在buff中,你将在一个需要字符串的函数中使用数据。
答案 3 :(得分:2)
data = malloc(s);
strcpy((char*)data,buf);
free(data);
答案 4 :(得分:2)
int n = MIN((x - 1), s);
char *bp = buf;
char *dp = (char *)data;
while (n--) {
*bp++ = *dp++;
}
*dp = '\0';