我正在尝试使用getopt()这样解析一些参数:
char *fileName = "medit.db";
char c = ' ';
while((c = getopt(argc, argv, "f")) != -1){
switch(c){
case 'f':
fileName = optarg;
printf("%s\n\n", fileName);
break;
}
}
问题是当我转到命令行并编写
./服务器-f测试
它只是给我一个空结果,但是如果我这样写
./ server -ftest
所有这些都很好。
为什么该代码无法按预期工作?
编辑:作为一个实验,我试图像这样f:
放置冒号。.有人可以解释吗?
答案 0 :(得分:2)
与getchar
一样,getopt
返回int
。那里所说的一切几乎都适用于这里。
getopt(3)中的原型:
int getopt(int argc, char * const argv[], const char *optstring);
将f
声明为需要自变量:
如果此类字符后接冒号,则该选项需要一个参数,因此getopt()将指针指向位于同一argv元素中的以下文本,或位于argarg中的下一argv元素的文本。
即格式为:
int c = ' ';
while((c = getopt(argc, argv, "f:")) != -1) {
switch(c){
case 'f':
fileName = optarg;
printf("%s\n\n", fileName);
break;
}
}
答案 1 :(得分:2)
您需要放置两个冒号,并且需要在未提供arg的情况下停止将optarg
分配给fileName:
getopt(argc, argv, "f::")
case 'f':
if (optarg)//CHECK FIRST
fileName = optarg;
printf("%s\n\n", fileName);
break;
optstring 是包含合法选项字符的字符串。如果 此类字符后接一个冒号,该选项需要一个 参数,因此getopt()将指针指向以下文本 相同的argv-element或以下argv-element的文本 optarg。 两个冒号表示一个选项带有一个可选的arg ;