memcpy() 实现循环缓冲区数据的读写
程序员文章站
2023-08-23 00:00:52
在做伪终端的时候需要处理数据溢出的问题,目前采取了这个策略,特地分享了下,希望大家可以一起成长 ......
使用memcpy()函数做循环缓冲区的读写
首先对mencpy函数做个简单的介绍
下面是 memcpy() 函数的声明
void *memcpy(void *str1, const void *str2, size_t n)
参数
str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
n -- 要被复制的字节数。
该函数返回一个指向目标存储区 str1 的指针。
/*******************************
mencpy的常见用法有如下:
1. 复制字符串
2. 复制字符串中从某个位置开始的某些子连续字符串
3. 覆盖字符串的原有内容
******/
好了长话短说, 直接进入主题
具体实现代码如下
1 #include <fstream> 2 #include <cstring> 3 #include "stdio.h" 4 #include "stdlib.h" 5 using namespace std; 6 7 8 #define data_recv_buff_len 13 //缓冲区大小 9 #define data_save_buff_len 2000 //保存区大小 10 int recv_buff_write = 0; //缓冲区写指针 11 int mark = -1; //缓冲区数据溢出 12 13 14 15 16 17 /* buf-->recv 把数据放入循环缓冲区*/ 18 void recvbuf(char* buf, char* save_recv, int len) 19 { 20 //数据为空则返回不做缓存 21 if (null == buf) return; 22 23 /* data-->buf */ 24 //判断缓存区是否还有足够的空间 25 if (len < (data_recv_buff_len - recv_buff_write)) 26 { 27 28 memcpy(&save_recv[recv_buff_write], buf, len); 29 recv_buff_write += len; 30 31 32 } 33 else 34 { 35 memcpy(&save_recv[recv_buff_write], buf, (data_recv_buff_len - recv_buff_write )); 36 memcpy(&save_recv[0], &buf[(data_recv_buff_len - recv_buff_write )], (len - (data_recv_buff_len - recv_buff_write ))); 37 //写指针重新计数 38 recv_buff_write = (len - (data_recv_buff_len - recv_buff_write)); 39 mark = 1; 40 } 41 } 42 43 //读取保存区数据数据 44 void getrecv(char* recv_buff) 45 { 46 char data_buff[data_save_buff_len] = { 0 }; //数据读取 47 /* buf-->data */ 48 //清空数组 49 memset(data_buff, 0, data_save_buff_len); 50 if (recv_buff_write >=0 and mark == -1) 51 { 52 memcpy(data_buff, &recv_buff[0], recv_buff_write); 53 } 54 else 55 { 56 57 memcpy(&data_buff[0], &recv_buff[recv_buff_write], data_recv_buff_len - recv_buff_write ); 58 memcpy(&data_buff[data_recv_buff_len - recv_buff_write ], &recv_buff[0], recv_buff_write ); 59 } 60 printf("%s\n", data_buff); 61 } 62 63 int main() 64 { 65 char st1[10] ="abcd"; 66 char st2[10] = "abcd"; 67 char st3[10] = "abcd"; 68 char st4[10] = "efgh"; 69 char recv_buff[data_recv_buff_len] = { 0 }; //缓冲区 70 recvbuf(st1, recv_buff, strlen(st1)); 71 printf("%d\n", recv_buff_write); 72 printf("%s\n", recv_buff); 73 recvbuf(st2, recv_buff, strlen(st2)); 74 printf("%d\n", recv_buff_write); 75 printf("%s\n", recv_buff); 76 recvbuf(st3, recv_buff, strlen(st3)); 77 printf("%d\n", recv_buff_write); 78 printf("%s\n", recv_buff); 79 recvbuf(st4, recv_buff, strlen(st4)); 80 printf("%d\n", recv_buff_write); 81 printf("%s\n", recv_buff); 82 printf("读取缓冲区的数据:\n"); 83 getrecv(recv_buff); 84 printf("mark is %d\n", mark); 85 return 0; 86 }
运行结果如下
好了,本次分享到此结束,不喜勿喷
上一篇: 设计模式 - 七大设计原则(四)- 合成复用原则与设计原则总结
下一篇: 按摩三穴位提神醒脑防感冒