读书人

求教!怎么实现字节数组的加减

发布时间: 2013-07-04 11:45:33 作者: rapoo

求教!如何实现字节数组的加减
刚学C++不久,遇到一个问题,向各位论坛老鸟们请教一下。

比如我有一串字节{1,2,3,4,5},那么我把它放入一个字节数组:
byte a[5]={1,2,3,4,5};
一会儿,我需要在其末尾添加另一串字节,比如{6,7},那么写成
a=a+{6,7};
是肯定错的,一方面a的长度固定,不可增加,另一方面,C++中的数组变量其实是一个指针,对于一个指针,自加一个集合,这肯定是非法的。

那么有什么方法能实现类似
??? a={1,2,3,4,5};
a=a+{6,7};
使得最后a的值为{1,2,3,4,5,6,7}

因为程序需要Unicode字符集,所以用wstring或CString中转不太可行,况且还需要一个额外的char[]变量辅助,比较麻烦,因为仅仅是需要在一小段代码中使用,所以没有必要构造新类重载运算符,
故求教有没有比较简单可行的方法。 字节集?数组 字节集 数组
[解决办法]
如果完全是char型数组的话,通过malloc申请,把两者连结起来.

1)数组a,数组b
2)malloc 数组c,其长度为a+b
3)c的开始部分赋为a,后续部分赋为b

如果你的编译器支持c99,那么可以支持变长数组.用变量表示a的长度.操作起来更快捷.
[解决办法]
仅供参考

//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <search.h>
#define MAXCHARS 512
int MAXLINES=10000,MAXLINES2;
char *buf,*buf2;
char PROG[256]="PROG";//程序Program需要的文件列表
char LIST[256]="LIST";//dir /b /s生成的实际文件列表List
FILE *fp,*fl;
int i,c,n,L,hh;
int ignore_case=0;
char ln[MAXCHARS];
int icompare(const void *arg1,const void *arg2) {
return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
return strcmp((char *)arg1,(char *)arg2);
}
int main(int argc,char **argv) {
if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG
if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST
if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
if ((fl=fopen(LIST,"rt"))==NULL) {
fprintf(stderr,"Can not open %s\n",LIST);
fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
return 1;
}
if ((fp=fopen(PROG,"rt"))==NULL) {
fclose(fl);
fprintf(stderr,"Can not open %s\n",PROG);
fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
return 2;
}
buf=(char *)malloc(MAXLINES*MAXCHARS);
if (NULL==buf) {
fclose(fl);
fclose(fp);
fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);
return 4;
}
n=0;
hh=0;


i=0;
while (1) {
if (fgets(ln,MAXCHARS,fl)==NULL) break;//
hh++;
L=strlen(ln)-1;
if ('\n'!=ln[L]) {//超长行忽略后面内容
fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS);
while (1) {
c=fgetc(fl);
if ('\n'==c
[解决办法]
EOF==c) break;//
}
}
while (1) {//去掉行尾的'\n'和空格
if ('\n'==ln[L]
[解决办法]
' '==ln[L]) {
ln[L]=0;
L--;
if (L<0) break;//
} else break;//
}
if (L>=0) {
strcpy(buf+i,ln);i+=MAXCHARS;
n++;
if (n>=MAXLINES) {
MAXLINES2=MAXLINES*2;
if (MAXLINES2==1280000) MAXLINES2=2500000;
buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);
if (NULL==buf2) {
free(buf);
fclose(fl);
fclose(fp);
fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);
return 5;
}
buf=buf2;
MAXLINES=MAXLINES2;


}
}
}
fclose(fl);
if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
else qsort(buf,n,MAXCHARS,compare);
hh=0;
while (1) {
if (fgets(ln,MAXCHARS,fp)==NULL) break;//
hh++;
L=strlen(ln)-1;
if ('\n'!=ln[L]) {//超长行忽略后面内容
fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS);
while (1) {
c=fgetc(fp);
if ('\n'==c
[解决办法]
EOF==c) break;//
}
}
while (1) {//去掉行尾的'\n'和空格
if ('\n'==ln[L]
[解决办法]
' '==ln[L]) {
ln[L]=0;
L--;
if (L<0) break;//
} else break;//
}
if (L>=0) {
if (ignore_case) {
if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);
} else {
if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);
}
}
}
fclose(fp);
free(buf);
return 0;
}

读书人网 >C++

热点推荐