getopt和字符串的奇怪问题

时间:2018-10-26 16:50:20

标签: c

我正在尝试使用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:放置冒号。.有人可以解释吗?

2 个答案:

答案 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 ;