打印argv中的元素之一时输出错误

时间:2018-10-28 21:36:20

标签: c arguments

我正在编写一个程序,该程序可通过目录递归,但是遇到了我的代码一个奇怪的问题。我使用以下代码编译并运行代码:

./sorter -c food -d thisdir -o thatdir

以下给出的参数总数为7。但是,当我尝试检查输入内容时,会得到意外的结果:

int main(int argc, char ** argv){
  int checkInputs = checkFlags(argc,argv);
  if(checkInputs == 1){
    fileSearch("."); 
  }
  else if(checkInputs == 2){
    printf("arg counts %d\n",argc); 
    printf("%s\n",argv[4]);
    fileSearch(argv[4]);
  }
  else if(checkInputs == 3){
    printf("arg counts %d\n",argc); 
    printf("%s\n",argv[4]);
    fileSearch(argv[4]); 
  }

  return 0;  
} 

当checkInputs为2时,它返回预期的输出,但是当它为3时,我在打印argv [4]时得到以下结果:

-d

以下是我的checkInputs函数,可能是导致此问题的原因:

int checkFlags(int argc, char * argv[]) {

  int output;

  if(argc < 3){
    printf("Not enough arguments\n");
    output = 0;
    return output;
  }
  else{
    int options;
    char * input = NULL;

    while((options = getopt(argc,argv,"c:d::o::")) != -1){
      switch(options) {
      case 'c':
        input = optarg;
        //printf("Mandatory flag: %s\n",optarg);
        output = 1;
        break;

      case 'd':
        //printf("We have an optional %s\n",argv[4]);
        output = 2;
        break;

      case 'o':
        //printf("We have two optionals: -d: %s & -o: %s\n",argv[4],argv[6]);
        output = 3;
        break;

      /* Probably don't need this case statement*/
      case '?':
        if(optopt == 'c'){
          printf("Unknown option, -%c not present\n",optopt);
          exit(0);
        }
          break;
        }
    }
  }
  return output;
}

但是,如果仅使用前2个标志编译程序,则一切正常。

1 个答案:

答案 0 :(得分:0)

通过调试代码,当checkInputs == 2./program -c hello -d时,我实际上遇到了分段错误。您应该通过添加IF并检查是否为选项-d提供路径来解决此问题。还请记住,参数的顺序可以不同。您可以将其他选项保存在变量中,以从checkFlags函数中访问它们。

执行./program -c food -d thisdir -o thatdir输出:

Mandatory flag: food
We have an optional thisdir
We have two optionals: -d: thisdir & -o: thatdir
arg counts 7
-o

它打印预期的。