繁体   English   中英

memcpy vs strcat

[英]memcpy vs strcat

似乎是一个基本的问题,但我宁愿要求清理而不是花费更多的时间。我正在尝试将数据复制到我收到的缓冲区(recv call),然后将其推送到文件中。 我想使用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);
}

问题:以后我会将数据输入到文件中。 只有第一个数据recv /添加到缓冲区才能进入文件。 此外,当我打印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或其他字符串函数。

您需要以二进制安全的方式写入文件。 检查如何使用fwrite而不是fputs。 fwrite将复制所有缓冲区,即使它中间有一个零。

const char *mybuff= "Test1\0Test2";
const int mybuff_len = 11;
size_t copied = fwrite(mybuff, mybuff_len, 1, output_file);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM