【问题标题】:Command line arguments not being passed in correctly命令行参数未正确传递
【发布时间】:2017-04-28 00:02:34
【问题描述】:

我正在编写一个适用于 BMP 文件的函数。我在传递命令行参数时遇到问题。

每当我使用调试器时,它都会说我的所有变量都已设为零。为什么是这样?我希望它等于命令行参数。

int main(int argc, char** argv)
{
    int side_length = 200;
    int x_offset = 0;
    int y_offset = 0;
    double r = 1.0;
    double g = 1.0;
    double b = 1.0;
    for(int i = 1; i < argc - 1 ; i++)
    {
        if(strcmp(argv[i], "-s"))
        {
            side_length = atoi(argv[i+1]);
        }
        else if(strcmp(argv[i], "-x"))
        {
            x_offset = atoi(argv[i+1]);
        }
        else if(strcmp(argv[i], "-y"))
        {
            y_offset = atoi(argv[i+1]);
        }
        else if(strcmp(argv[i], "-r"))
        {
            r = atof(argv[i+1]);
        }
        else if(strcmp(argv[i], "-g"))
        {
            g = atof(argv[i+1]);
        }
        else if(strcmp(argv[i], "-b"))
        {
            b = atof(argv[i+1]);
        }
    }
    draw_waves(side_length, x_offset, y_offset, r, g, b);
    return 0;
}

【问题讨论】:

  • strcmp(argv[i], "-s") --> strcmp(argv[i], "-s")==0!strcmp(argv[i], "-s")
  • 你用的是什么调试器?
  • '最好使用(POSIX 或 GNU)getopt() 函数。除此以外,在测试其中一个选项之后,您转换下一个参数,但您不会跳过它。因此,如果用户执行-b -4,您可能会得到有趣的结果。当您不报告无法识别的选项时,它不会受到伤害;如果你这样做了。 (循环中缺少else。)
  • @BLUEPIXY 啊!谢谢!
  • @Code-Apprentice 修复了问题,但是我用的是gdb

标签: c command-line


【解决方案1】:

strcmp() 当两个字符串相等时返回 0,所以你应该这样做:

if(strcmp(argv[i], "-s") == 0)

【讨论】:

    【解决方案2】:

    您当前的代码存在几个问题。这是更接近的东西:

    #include <stdio.h>
    
    int main(int argc, char** argv)
    {
        int side_length = 200;
        int x_offset = 0;
        int y_offset = 0;
        double r = 1.0;
        double g = 1.0;
        double b = 1.0;
        for (int i_flag = 1; i_flag < argc; i_flag += 2) {
            int i_val = i_flag + 1;
            if (i_val >= argc) {
                fprintf(stderr, "Missing value for flag %s\n", argv[i_flag]);
                return 1;
            }
            if (strcmp(argv[i_flag], "-s") == 0) side_length = atoi(argv[i_val]);
            else if (strcmp(argv[i_flag], "-x") == 0) x_offset = atoi(argv[i_val]);
            else if(strcmp(argv[i_flag], "-y") == 0) y_offset = atoi(argv[i_val]);
            else if(strcmp(argv[i_flag], "-r") == 0) r = atof(argv[i_val]);
            else if(strcmp(argv[i_flag], "-g") == 0) g = atof(argv[i_val]);
            else if(strcmp(argv[i_flag], "-b") == 0) b = atof(argv[i_val]);
            else {
              fprintf(stderr, "Unknown flag %s\n", argv[i_flag]);
              return 2;
            }
        }
        printf("side=%d xofs=%d yofs=%d r=%f g=%f b=%f\n",
          side_length, x_offset, y_offset, r, g, b);
        return 0;
    } 
    

    然后

    $ gcc foo.c -o foo
    $ ./foo
    side=200 xofs=0 yofs=0 r=1.000000 g=1.000000 b=1.000000
    $ ./foo -s 1 -x 2 -y 3 -r 1.5 -g 2.5 -b 3.5
    side=1 xofs=2 yofs=3 r=1.500000 g=2.500000 b=3.500000
    $ ./foo -a 1
    Unknown flag -a
    $ ./foo -a
    Missing value for flag -a
    

    剩下的一个弱点是atoiatof 会默默地为错误的参数返回零。这不是一件好事。考虑使用sscanf 并检查其返回值以验证转换是否正确。

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2013-12-29
      • 2011-05-21
      • 2020-08-24
      • 2018-04-07
      相关资源
      最近更新 更多