getopt_long不传递参数

时间:2014-04-01 08:57:34

标签: c posix

我可能只是让我对下面的代码视而不见,但我无法让getopt_long传递参数“maska”,即ARG_MASK0。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <getopt.h>

typedef char Char;
typedef int Int;
typedef unsigned char UInt8;

enum eArgs {
    ARG_MOTION=258, //258
    ARG_MASK0,  //259
    ARG_MASK1,  //260
    ARG_NO_TTY  //261
};


void main(Int argc, Char *argv[])
{
    const Char shortOptions[] = "h";
    const struct option longOptions[] = {
        {"motion",           required_argument, NULL, ARG_MOTION},
        {"maska",             required_argument, NULL, ARG_MASK0},
        {"maskb",             required_argument, NULL, ARG_MASK1},
        {"notty",            no_argument,       NULL, ARG_NO_TTY},
        {"help",             no_argument,       NULL, 'h'},
        {0, 0, 0, 0}
    };

    Char    *end;
    Int     index;
    Int     c,i;
    UInt8   mask[10];

    fprintf(stderr, "argc=%i\n", argc);
    for(i=1; i < argc; i++) {
        fprintf(stderr, "argv[%i]=%s\n", i,argv[i]);
    }

    for (;;) {
        c = getopt_long(argc, argv, shortOptions, longOptions, &index);

        fprintf(stderr,"c=%i\n", c);

        if (c == -1) {
            break;
        }
    }
}

我在Ubuntu上编译代码为:

gcc test_parseargs.c -o main

并按以下方式运行:

./main --motion --maska=0 --maskb=1 --notty

获取输出:

argc=5
argv[1]=--motion
argv[2]=--maska=0
argv[3]=--maskb=1
argv[4]=--notty
c=258
c=260
c=261
c=-1

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:2)

你的论点存在问题

{"motion",           required_argument, NULL, ARG_MOTION}, //code

./main --motion --maska=0 --maskb=1 --notty

缺少运动的论据。请尝试以下。

./main --motion=1 --maska=0 --maskb=1 --notty

在上一次运行中, - maska = 0被视为运动的参数

答案 1 :(得分:2)

代码是正确的。

您没有向--motion提供参数。因此,--maska=0用作--motion的参数,其余参数正确显示为

c=260
c=261