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扩展——带有可选参数的可选标志。通常应避免最后这些。