第二个参数不适用于命令行参数

时间:2015-12-08 20:25:51

标签: c++ c visual-studio-2015 computer-vision

使用visual studio 2015提供命令行参数,显示第二个参数的错误。代码如下

// command line options
        printf("Mandatory arguments to long options are mandatory for short options too.\n");
        printf("  -i,  --input=PATH          set the path to the input image\n");
        printf("                               (*.jpg, *.png, etc.)\n");
        printf("  -o,  --output=PATH         set the path to the output image\n");
        printf("                               (*.jpg, *.png, etc.)\n");

每当我给出输出路径时,它就会显示错误。 Invalid command line argument。我的序列就像E:\ 1.jpg D:\命令行参数。

编辑:

解析代码

// parse command line arguments
    arg = 2;

    while(arg < argc)
    {
        //
        if(0==strcmp("-u", argv[arg]) || 0==strcmp("--usepyr", argv[arg]))
        {
            usepyr = 1;
            ++arg;
        }
        else if(0==strcmp("-i", argv[arg]) || 0==strcmp("--input", argv[arg]))
        {
            if(arg+1 < argc)
            {
                //
                sscanf(argv[arg+1], "%s", input);
                arg = arg + 2;
            }
            else
            {
                printf("# missing argument after '%s'\n", argv[arg]);
                return 1;
            }
        }
        else if(0==strcmp("-o", argv[arg]) || 0==strcmp("--output", argv[arg]))
        {
            if(arg+1 < argc)
            {
                //
                sscanf(argv[arg+1], "%s", output);
                arg = arg + 2;
            }
            else
            {
                printf("# missing argument after '%s'\n", argv[arg]);
                return 1;
            }
        }

尝试运行并检查here

中示例代码的结果

enter image description here 谢谢

1 个答案:

答案 0 :(得分:0)

部分问题是:argv [0]是正在执行的程序的名称。

argv [1]是第一个命令行参数(它应该是-i-o)。

通常,不使用任何命令行快捷方式功能,例如getopt()

代码需要做的第一件事是确保存在所需的命令行参数。 (根据您发布的代码,argc需要为5)

然后,在循环中,检查argv [x],(其中x是1还是3)是-o还是-i

然后,根据检查结果,

将argv [x + 1]作为输入文件或输出文件。

在循环中完成所有这些检查

正如代码所做的那样,按序列进行检查,对参数的顺序做了很多假设,忽略了检查以确保参数有效。

即。从不信任用户输入,始终完全检查其有效性

建议在只允许单个字符参数的情况下使代码正常工作,然后修改代码以允许--longname参数