命令行参数未正确传递

时间:2017-04-28 00:02:34

标签: c command-line

我正在编写一个与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;
}

2 个答案:

答案 0 :(得分:0)

当两个字符串相等时,

strcmp()返回0,所以你应该这样做:

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

答案 1 :(得分:0)

您当前代码的几个问题。这是更接近的事情:

#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默默地为坏args返回零。这不是一件好事。请考虑使用sscanf并检查其返回值以验证转换是否正确。