C - 从特定大小的缓冲区读取字符串

时间:2010-07-18 15:32:44

标签: c string size buffer

我有一个 char buf [x] int s void * data

我想从 buf 中将 s 的字符串写入 data

我该怎么做?

提前致谢。

5 个答案:

答案 0 :(得分:4)

假设

  • by“string”你的意思是一个以空字符结尾的字符串,通常用C表示;
  • 您尚未在data;
  • 中分配内存
  • 你已经知道s< = x

首先,您需要在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';