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

C 打印argv中的一个元素时输出错误,c,arguments,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("."); }

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

./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;
}
int检查标志(int-argc,char*argv[]){
整数输出;
如果(argc<3){
printf(“参数不足\n”);
输出=0;
返回输出;
}
否则{
int选项;
char*input=NULL;
while((options=getopt(argc,argv,“c:d::o:”)!=-1){
开关(选项){
案例“c”:
输入=optarg;
//printf(“强制标志:%s\n”,optarg);
输出=1;
打破
案例“d”:
//printf(“我们有一个可选的%s\n”,argv[4]);
输出=2;
打破
案例“o”:
//printf(“我们有两个选项:-d:%s&-o:%s\n”,argv[4],argv[6]);
输出=3;
打破
/*可能不需要这个案例陈述*/
案例“?”:
如果(optopt='c'){
printf(“未知选项,-%c不存在”,optopt);
出口(0);
}
打破
}
}
}
返回输出;
}

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

通过调试代码,当
checkInputs==2
/program-c hello-d
时,我实际上得到了一个分段错误。您应该通过为选项
-d
添加IF并检查是否提供了路径来解决此问题。还要记住,参数的顺序可能不同。您可以将额外选项保存在变量中,以便通过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

它会打印出预期的结果

我不明白你的问题是什么。对不起,每当我打印argv[4]时,当checkInputs等于3时,每当我打印argv[4]时,它都会给我不正确的输出。你能在你的问题中包含a吗?(请阅读链接文章。)我认为您没有正确阅读getopt文档。没有强制标志这样的东西。存在不接受参数的可选标志;不接受参数的可选标志;以及——作为Gnu扩展——带有可选参数的可选标志。通常应避免最后这些。