#2
hu9jj2014-07-08 07:13
|
程序代码:
#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 编辑 ]