请教char buf[100]的100能不能用变量替换?
请教,对于下面的定义,buf的大小能不用用变量替代?
比如先获取一个文件的字节数,然后用这个文件的字节数替换10000000
char buf[10000000];
[解决办法]
不能,不过你可以用指针,malloc, 用完free就可以啊。
[解决办法]
不可以。 可以使用std::vector<char> 或std::array<char>
unsigned int size;
...
std::vector<char> buf(size);
char* pbuf = &buf[0];
[解决办法]
C99可以
C11可能可以
C++完全不行
[解决办法]
char buf[10000000] 编译器已经开始分配内存 ,如果你用变量 编译器不能识别,动态分配 还是用指针malloc
[解决办法]
如果是静态数组的话,数组的大小必须定义时就确定,不然编译会出问题,一般用用个计数器算出文件中包括的字节数,然后用malloc(C中的)或者new(C++)中进行程序的动态开辟,就可以了,
[解决办法]
可以动态分配 new[SIZE] 或者 malloc(SIZE)
[解决办法]
首先,
char a[1000000000];
这个 a 在栈里,应用程序的默认栈是很小的,很有可能编译通过,运行也挂了。而且,不建议在栈里放如此大的东西。
其次,在最新的C++11标准里,是支持
char a[var];
的,在GCC 4.8下
int pp = 100;
char ddd[pp];
pp++;
char ttt[pp];
for (int i = 0;i<100;i++) ddd[i] = i;
for (int i = 0;i<101;i++) ttt[i] = i;
是可以的,要打开-std=c++11选项
再次,动态分配是最好的解决方案。建议动态分配!
如果怕管理生存期,建议翻翻 shared_ptr的文档。
[解决办法]
说能用变量替换的人试试将变量的值设为2147483648
[解决办法]
仅供参考
//输出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;
}
[解决办法]