我有一个宽度函数,当前定义为“unsigned long width”,然后将其定义为“width = 16”。
相反,我希望16是默认数字,但我希望有一个选项,可以在启动时使用命令行为宽度设置不同的整数。
命令可以是/ program命令-width 100 filename
我尝试按照以下方式执行此操作,但它无法编译,我无法成功调试它。 Main设置为int main(int argc,char * argv [])。
我的尝试
void process_file(FILE *infile,unsigned long end)
{
char ch;
int width,start,f_index=0; //File index
unsigned long bb_index=0; // Buffer index
//width =16; // Width is fixed as 16
if((argc == 5) && (strcmp(argv[2],"-width") == 0))
{
width = atoi(argv[3]);
}
else
{
width = 16;
}
unsigned char *byte_buffer = malloc(width);
start=0; // Starting at zero
while (!feof(infile))
{
ch = getc(infile);
if ((f_index >= start)&&(f_index <= end))
{
byte_buffer[bb_index] = ch;
bb_index++;
}
if (bb_index >= width)
{
print(byte_buffer,bb_index,width);
bb_index=0;
}
}
具有已定义(静态)宽度的原始函数,但不会读取argv [3]
void process_file(FILE *infile,unsigned long end)
{
char ch;
unsigned long width,start,f_index=0; //File index
unsigned long bb_index=0; // Buffer index
width =16; // Width is fixed as 16
unsigned char *byte_buffer = malloc(width);
start=0; // Starting at zero
while (!feof(infile))
{
ch = getc(infile);
if ((f_index >= start)&&(f_index <= end))
{
byte_buffer[bb_index] = ch;
bb_index++;
}
if (bb_index >= width)
{
print(byte_buffer,bb_index,width);
bb_index=0;
}
f_index++;
}
if (bb_index)
print(byte_buffer,bb_index,width);
fclose(infile);
free(byte_buffer);
}
答案 0 :(得分:0)
argc和argv没有被传递到process_file,所以它不会编译。
尝试解析main函数中的命令行参数,并将width作为参数传递给process_file。
您还应该重新排序参数,使其在宽度之前具有文件名,因为宽度是可选的,而文件名不是?
也许你的主要功能看起来像。
int main(int argc, char** argv)
{
/*
usage program <command> <filename> -width 100
*/
if(argc < 3)
{
printf("not enough args\n");
} else
{
int width = 16;
if((argc == 5) && (strcmp(argv[3],"-width") == 0))
{
// atoi doe not detect conversion failure use strol maybe?
width = atoi(argv[4]);
}
FILE* f = fopen(argv[2], "r");
if(f)
{
int arbitary_endval = 100;
process_file(f, arbitary_endval, width);
} else
{
printf("could not open file %s\n", argv[2]);
}
}
}
我已将100英寸作为结束的任意值。
答案 1 :(得分:0)
程序将无法编译,因为argc
和argv
在函数process_file
的范围内未定义。声明int main(int argc, char *argv[])
没问题,但它仅在argc
函数本身的正文中声明argv
和main
。
我建议将argc
和argv
作为函数process_file
的附加参数传递,或者在process_file
之外解析命令行并将宽度作为参数传递给那个功能。
您对命令行中的事物顺序的规则似乎有点严格,但如果width是唯一可选的命令行参数,那么您可以使用这种逻辑。
以下是有关命令行选项的更一般性问题,其中包含一些好的答案:Parsing command-line arguments?