如何防止getopt与缺少参数的选项混淆?

时间:2016-11-01 12:46:43

标签: unix gcc posix libc getopt

说,我有代码:

while ((c = getopt(argc, argv, ":n:p")) != -1) {
    switch (c) {
    case 'n':
        syslog(LOG_NOTICE, "n: %s", optarg);
        break;
    case 'p':
        /* ... some code ... */
        break;
    case ':':
        /* handle missing arguments to options requiring arguments */
        break;
    /* some cases like '?', ... */
    default:
        abort();
    }
}

当我将我的程序称为

./main -n -p

打印:

n: -p

为什么不返回getopt:表示缺少-n的参数但是使用-p作为参数参数?

2 个答案:

答案 0 :(得分:2)

完全可以使用以破折号开头的选项参数,并且通常类似于另一个选项。 getopt没有理由报告错误。

如果程序不想接受这样的选项参数,它应该专门检查它们,例如

   if (optarg[0] == '-') {
      // oops, looks like user forgot an argument
      err("Option requires an argument");
   }

答案 1 :(得分:1)

我有类似的问题,我让它落到了默认情况。不确定是否操纵optopt变量是一个问题,但似乎有效:

while ((c = getopt(argc, argv, "a:d:x")) != -1)
{
    switch (c) 
    {
        case 'a':
            if (optarg[0] == '-' && err == 0)
            {
                err = 1;
                optopt = 'a';
            }
            else if (err == 0)
            {
                aflag = 1;
                aArg = optarg;
                break;
            }
        case 'd':
            if (optarg[0] == '-' && err == 0)
            {
                err = 1;
                optopt = 'd';
            }
            else if (err == 0)
            {
                dflag = 1;
                dArg = optarg;
                break;
            }
        case 'x':
            if (err == 0)
            {
                xflag = 1;
                break;
            }
        default:
            if (optopt == 'a' || optopt == 'd')
            {
                fprintf(stderr, "Option -%c requires an argument.\n", optopt);
                return 1;
            }
            else
            {
                fprintf(stderr, "Unknown option '-%c'\n", optopt);
                return 2;
            }
    }//end of switch
}//end of while