我的开关功能出了什么问题?

时间:2017-01-25 23:50:38

标签: c switch-statement argv

我的开关功能出了什么问题? 看起来像这样

void ss(int argc, char *argv[])
{
  int side_length = 200;
  double red = 0.0;
  double green = 0.0;
  double blue = 0.0;

  for (int i = 1; i <= argc; i++) {
    printf("%s\n", argv[i]);
    if (*argv[i] == '-'){
      switch (*++argv[i]) {
        case 'r':
          red = sin(0.2*atof(argv[i++]));
          printf("argv: %f\n", sin(0.2*atof(argv[i++])));
          printf("red: %f\n", red);
          break;
      }
    }
  }
}

我打算稍后添加更多切换案例,但是现在我专注于红色,所以我可以复制它。似乎问题在于它只是没有将我想要的值存储为红色,它返回其他printf语句中的值就好了。

编辑:我已经同时使用了(int i = 1; i&lt; argc; i ++)和for(int i = 1; argv [i]!='\ 0'; i ++)并且两者都没有用。还在寻找答案。

2 个答案:

答案 0 :(得分:1)

你试图用增量运算符一次做太多。结果,您对代码的作用感到困惑。具体来说,在计算正弦时,在循环内部增加i两次。

仅在需要时才打破额外增量:

  for (int i = 1; i < argc; i++) {
    printf("%s\n", argv[i]);
    if (argv[i][0] == '-'){     // check the first char of the current arg
      switch (argv[i][1]) {     // check the second char of the current arg
        case 'r':
          red = sin(0.2*atof(argv[i+1]));   // grab the value from the next arg
          printf("argv: %f\n", sin(0.2*atof(argv[i+1])));   // grab the next arg again
          printf("red: %f\n", red);
          i++;                  // do an extra increment at the end since we processed 2 args
          break;
      }
    }
  }

答案 1 :(得分:0)

由于i++操作太多,您的程序会调用未定义的行为,因为您访问argv数组越界。

之后,你无法对程序的行为说些什么。甚至允许删除所有文件。