gpt4 book ai didi

c - memcpy 与 strcat

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

似乎是一个基本问题,但我宁愿问这个问题,也不愿在这上面花更多的时间。我正在尝试将数据复制到我收到的缓冲区中(recv 调用),然后将其推送到文件.我想使用 memcpy 不断地将数据追加/添加到缓冲区,直到缓冲区的大小不足以容纳比使用 realloc 时更多的数据。代码如下。

int vl_packetSize = PAD_SIZE + (int)p_size - 1; // PAD_SIZE is the size of char array sent 
//p_size is the size of data to be recv. Same data size is used by send
int p_currentSize = MAX_PROTO_BUFFER_SIZE;
int vl_newPacketSize = p_currentSize;

char *vl_data = (char *)malloc(vl_packetSize);
memset((char *)vl_data,'\0',vl_packetSize);


/* Allocate memory to the buffer */
vlBuffer = (char *)malloc(p_currentSize);
memset((char *)vlBuffer,'\0',p_currentSize);
char *vlBufferCopy = vlBuffer;

if(vlBuffer==NULL)
return ERR_NO_MEM;

/* The sender first sends a padding data of size PAD_SIZE followed by actual data. I want to ignore the pad hence do vl_data+PAD_SIZE on memcpy */
if((p_currentSize - vl_llLen) < (vl_packetSize-PAD_SIZE)){
vl_newPacketSize +=vl_newPacketSize;
char *vlTempBuffer = (char *)realloc(vlBufferCopy,(size_t)vl_newPacketSize);
if(vlTempBuffer == NULL){
if(debug > 1)
fprintf(stdout,"Realloc failed:%s...Control Thread\n\n",fn_strerror_r(errno,err_buff));
free((void *)vlBufferCopy);
free((void *)vl_data);
return ERR_NO_MEM;
}
vlBufferCopy = vlTempBuffer;
vl_bytesIns = vl_llLen;
vl_llLen = 0;
vlBuffer = vlBufferCopy+vl_bytesIns;
fprintf(stdout,"Buffer val after realloc:%s\n\n",vlBufferCopy);
}

memcpy(vlBuffer,vl_data+PAD_SIZE,vl_packetSize-PAD_SIZE);

/*
fprintf(stdout,"Buffer val before increment:%s\n\n",vlBuffer);
fprintf(stdout,"vl_data length:%d\n\n",strlen(vl_data+PAD_SIZE));
fprintf(stdout,"vlBuffer length:%d\n\n",strlen(vlBuffer));
*/

vlBuffer+=(vl_packetSize-PAD_SIZE);
vl_llLen += (vl_packetSize-PAD_SIZE);
vl_ifNotFlush = 1;
//fprintf(stdout,"Buffer val just before realloc:%s\n\n",vlBufferCopy);
}

问题:以后我什么时候将数据放入文件中。只有接收到/添加到缓冲区的第一个数据才会进入文件。此外,当我打印 vlBufferCopy 的值(它指向 malloc 或 realloc 返回的数据的第一个位置)时,我得到了相同的结果。如果我将大小减小 1,我会看到文件中的全部数据,但它会以某种方式错过换行符,因此数据是没有以正确的格式插入到文件中。我知道这是因为尾随 '\0' 但一些如何将大小减少 1

(vlBuffer+=(vl_packetSize-PAD_SIZE-1);)

缺少换行符。放置数据时的 fputs 删除尾随的空字符请让我知道我在这里缺少什么来检查或逻辑(注意:我尝试使用 strcat:

strcat(vlBuffer,vl_data+PAD_SIZE);

但我想使用 memcpy,因为它更快,而且它可以用于任何类型的缓冲区,而不仅仅是字符指针

谢谢

最佳答案

strcatmemcpy 是非常不同的函数。
我建议你阅读每个文档。

主要有两点不同:
1. memcpy 将数据复制到您指定的位置。 strcat 找到字符串的末尾,并复制到那里。
2. memcpy 复制您请求的字节数。 strcat 复制直到终止 null。

如果您正在处理任意内容的数据包,则您没有用到 strcat 或其他字符串函数。

关于c - memcpy 与 strcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9653071/

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