我的代码使用getopt从命令行获取参数。我希望能够获得三个必需的参数,以及一个可选的第四个参数。我们分别称这些输入A和B : ./ main string1 string2 filename 或 ./ main -n 3 string1 string2 filename 。
我被告知可选参数不需要放在开头,所以以下内容也应该有用。我们称之为输入C : ./ main string1 string2 -n 3 filename 。请注意,其他3个参数必须按顺序排列。这是我遇到麻烦的部分。
目前,我的代码如下所示:
int c;
int n;
while ((c = getopt(argc,argv,"n:"))!=-1) {
printf("Loop\n");
switch (c) {
case 'n':
cvalue = optarg;
n = atoi(optarg);
break;
case '?':
break;
default:
break;
}
}
如果我输入B,代码就可以工作,即进入循环并将输入正确分配给n。但是,如果我输入C,它甚至不进入循环,即它似乎甚至没有在参数中注册-n 3。这是预期的行为,还是我在代码中遗漏了什么?我该如何解决这个问题?
答案 0 :(得分:0)
getopt()实现“标准”命令行结构,即所有选项都在所有参数(ref)之前。并非所有的Unix命令都遵循这个“标准”;如果你的命令需要偏离,你可以手动解析argv [],而不需要getopt()函数。来自man 3 getopt:
If there are no more option characters, getopt() returns -1. Then
optind is the index in argv of the first argv-element that is not an
option.