命令行参数变量为整数

时间:2014-10-14 02:03:37

标签: c

我有一个宽度函数,当前定义为“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);
}

2 个答案:

答案 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)

程序将无法编译,因为argcargv在函数process_file的范围内未定义。声明int main(int argc, char *argv[])没问题,但它仅在argc函数本身的正文中声明argvmain

我建议将argcargv作为函数process_file的附加参数传递,或者在process_file之外解析命令行并将宽度作为参数传递给那个功能。

您对命令行中的事物顺序的规则似乎有点严格,但如果width是唯一可选的命令行参数,那么您可以使用这种逻辑。

以下是有关命令行选项的更一般性问题,其中包含一些好的答案:Parsing command-line arguments?