求教!如何实现字节数组的加减

csdcr 2013-06-13 11:15:15
刚学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[]变量辅助,比较麻烦,因为仅仅是需要在一小段代码中使用,所以没有必要构造新类重载运算符,
故求教有没有比较简单可行的方法。
...全文
276 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdcr 2013-06-14
  • 打赏
  • 举报
回复
感谢各位大大解答,大致有点明白了,结贴了先哈
whizer 2013-06-13
  • 打赏
  • 举报
回复
如果完全是char型数组的话,通过malloc申请,把两者连结起来. 1)数组a,数组b 2)malloc 数组c,其长度为a+b 3)c的开始部分赋为a,后续部分赋为b 如果你的编译器支持c99,那么可以支持变长数组.用变量表示a的长度.操作起来更快捷.
www_adintr_com 2013-06-13
  • 打赏
  • 举报
回复
其实你可以使用 std::string
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写!”
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
“变量赋值”和“变量初始化”不是一回事! “变量赋值”发生在运行期,其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期,其写法遵循初始化列表语法规定。
// 比如我有一串字节{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}
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
char *a,*a1;
int i;
int main() {
    a=(char *)malloc(5);
    if (NULL==a) exit(1);
    a[0]=1;
    a[1]=2;
    a[2]=3;
    a[3]=4;
    a[4]=5;
    for (i=0;i<5;i++) printf("%d ",a[i]);
    printf("\n");
    a1=(char *)realloc(a,7);
    if (NULL==a1) exit(2);
    a=a1;
    a[5]=6;
    a[6]=7;
    for (i=0;i<7;i++) printf("%d ",a[i]);
    printf("\n");
    free(a);
    return 0;
}
//1 2 3 4 5
//1 2 3 4 5 6 7
//
csdcr 2013-06-13
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。
没想吃糖,问题是总得实现这效果吧,您倒是告诉我怎么实现这种效果。
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
仅供参考
//输出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;
}
csdcr 2013-06-13
  • 打赏
  • 举报
回复
引用 6 楼 whizer 的回复:
如果完全是char型数组的话,通过malloc申请,把两者连结起来. 1)数组a,数组b 2)malloc 数组c,其长度为a+b 3)c的开始部分赋为a,后续部分赋为b 如果你的编译器支持c99,那么可以支持变长数组.用变量表示a的长度.操作起来更快捷.
感谢解答,貌似vs2008不支持C99标准,malloc的思路我也想到过,但是我需要追加多少次和每次增加的长度都是未知的,这样的话似乎要声明N个变量进行辅助,无论从哪方面来说都是不大可行的。
csdcr 2013-06-13
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] “变量赋值”和“变量初始化”不是一回事! “变量赋值”发生在运行期,其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期,其写法遵循初始化列表语法规定。
// 比如我有一串字节{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}
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
char *a,*a1;
int i;
int main() {
    a=(char *)malloc(5);
    if (NULL==a) exit(1);
    a[0]=1;
    a[1]=2;
    a[2]=3;
    a[3]=4;
    a[4]=5;
    for (i=0;i<5;i++) printf("%d ",a[i]);
    printf("\n");
    a1=(char *)realloc(a,7);
    if (NULL==a1) exit(2);
    a=a1;
    a[5]=6;
    a[6]=7;
    for (i=0;i<7;i++) printf("%d ",a[i]);
    printf("\n");
    free(a);
    return 0;
}
//1 2 3 4 5
//1 2 3 4 5 6 7
//
此为正解![/quote] 非常感谢解答,可是我的数据有少说也有几十个,多的话有上百个,按您的写法形如a[i]=x肯定是不现实的(要不然就不会发明循环结构了),烦问有没有能够为数组变量连续赋值(所赋内容长度未知)的方法
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
“变量赋值”和“变量初始化”不是一回事! “变量赋值”发生在运行期,其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期,其写法遵循初始化列表语法规定。
// 比如我有一串字节{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}
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
char *a,*a1;
int i;
int main() {
    a=(char *)malloc(5);
    if (NULL==a) exit(1);
    a[0]=1;
    a[1]=2;
    a[2]=3;
    a[3]=4;
    a[4]=5;
    for (i=0;i<5;i++) printf("%d ",a[i]);
    printf("\n");
    a1=(char *)realloc(a,7);
    if (NULL==a1) exit(2);
    a=a1;
    a[5]=6;
    a[6]=7;
    for (i=0;i<7;i++) printf("%d ",a[i]);
    printf("\n");
    free(a);
    return 0;
}
//1 2 3 4 5
//1 2 3 4 5 6 7
//
此为正解!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧