借个位置放下,关于如何定义一个良好的 API 接口的试验
//双缓冲的使用API 自己写的 其实双缓冲 我觉得用多线程来实现要好点,程序代码:
#include "stdafx.h" #include <stdlib.h> typedef struct double_arrary{ //双数组的数据结构 char *str; //字符串1 char *str1; //字符串2 char *dumpstring; int strlen1; //字符串1的长度大小 int strlen2; //字符串2的长度大小 int strlen3; int flag; //用双位表示字符串是否有数据的状态 二进制10 str1有2无 , 11 都有 ,01表示 str1无str2有 int signal_flag //还有没有数据的指示标志,先不复杂化问题 将其单独出来 不和上面的flag合并 int topflag; //当前尾巴指针在那个字符串中 int baseflag; //当前 头指针在那个字符串中 int dumpflag //指示是否转储过字符串 char *base; //字符串的头指针位置 char *top; //字符串的当前处理位置指针 }double_arrary,*pdouble_arrary; struct double_arrary * malloc_double_arrary(int n1,int n2) //提供接口 创建一个双数组的读写对象 n1 n2 分别对应数组的大小 { pdouble_arrary node; node=(double_arrary*)malloc(sizeof(double_arrary)); node->str=(char*)malloc(n1); node->str1=(char*)malloc(n2); node->strlen1=n1; node->strlen2=n2; node->base=node->top=str; node->flag=0; return node; } void getbaseinit(struct double_arrary *node,char *data1,char *data2,int n1,int n2) //对双数组对象的初始化 { if(data1!=NULL&&data2!=NULL){ node->flag=3; node->baseflag=node->topflag=1; node->base=bode->top=str; } if(data1==NULL&&data2!=NULL){ node->flag=1; node->baseflag=node->topflag=2; node->base=bode->top=str1; } if(data1!=NULL&&data2==NULL){ node->flag=2; node->baseflag=node->topflag=1; node->base=bode->top=str; } if(data1==NULL&&data2==NULL){ node->flag=0; printf("no data 完成"); //退出点 } if(data1!=NULL&&node->strlen<n1){ node->str=(char*)remalloc(node->str,n1); node->strlen1=n1; strncpy(node->str,data1,n1); } if(data2!=NULL){ node->str=(char*)remalloc(node->str2,n2); node->strlen2=n2; strncpy(node->str1,data2,n2); } } void signal_deal(struct double_arrary *node,int flag) //使用者指示程序还有没有数据给出 flag=0表示没有数据了,否则就代表还有数据 { node->signal_flag=flag; } int data_deal(struct double_arrary *node) //数据处理部分 { char *string1 *string2,int n,n2,int flag=0; if(node->flag==0) return 0; while(node->flag!=0){ if((node->flag==1||node->flag==2)&&node->signal_flag==1) return 1; //有一个字符串数组处理完成了,且还有数据要处理,就从这个函数中返回去拿数据 if(node->topflag==1){ string=node->str; string2=node->str1; n=node->strlen1; n2=node->strlen2; flag=2; } if(node->topflag==2){ string=node->str1; n=node->strlen2; string2=node->str; n2=node->strlen1; flag=1; } while(node->top<(string+n)){ if(*(node->top)==' '&&(node->base==node->top)){ node->base++; } else{ if(*node->top==' '){ printf("this is a world"); //字符的处理部分 在这添加 假如dumpflag=1则字符串等于dumpstring+base到top之间的数据 //如果dumpflag=0的话 等于base到top之间的数据 if(node->baseflag!=node->topflag) node->flag^=node->baseflag; node->base=node->top+1; } } node->top++; } if((node->flag^flag)){ if(node->topflag!=node->baseflag) { //当base指针在一个字符数组中,而top在另一个数组中 且另一个数组全部处理完的时候 ,此时,由于base //所在数组并未读入新的数据,所以top不能进入这个数组进行数据的处理,这个地方可能出现多次要转储字符串的情况 if(node->dumpflag==0){ node->strlen3=n+string2+n2-base-1; dumpstring=(char*)malloc(node->strlen3); strncpy(dumpstring,base,string2+n2-base-1); strncat(dumpstring,string,n); } else{ node->strlen3+=n+string2+n2-base-1; dumpstring=(char*)remalloc(dumpstring,node->strlen3); strncat(dumpstring,base,string2+n2-base-1); strncat(dumpstring,string,n); } node->base=node->top=string2; node->baseflag=node->topflag=flag; node->flag=0; node->dumpflag=1; } else{ node->top=string2; node->topflag=flag; } } else{ if(node->signal_flag==0) return 0; node->top--; } } if(node->signal_flag==1) return 1; } void getdata(struct double_arrary *node,char* string,int n) { if(node->signal_flag==0) return 0 ; //循环出口 if((node->flag&2)==0){ if(string!=NULL&&node->strlen1<n){ node->str=(char*)remalloc(node->str,n); node->strlen1=n; } strncpy(node->str,string,n); node->flag|=2; } if((node->flag&1)==0){ if(string!=NULL&&node->strlen2<n){ node->str1=(char*)remalloc(node->str1,n); node->strlen2=n; } node->flag|=1; strncpy(node->str1,string,n); } }
接口使用方法
malloc_double_arrary(int n1,int n2) //建立一个双字符串数组的对象
getbaseinit(struct double_arrary *node,char *data1,char *data2,int n1,int n2) //初始化对象
signal_deal(struct double_arrary *node,int flag) //指示对象 还有后续的处理数据否
while(data_deal(struct double_arrary *node)){ //进入循环, 数据处理完退出循环
getdata(struct double_arrary *node,char* string,int n) //给对象取数据
signal_deal(struct double_arrary *node,int flag) //指示对象还有后续数据否
}
我好像是开窍了,应该是的,站的位置又高一步
[ 本帖最后由 zhu224039 于 2014-7-11 04:48 编辑 ]