getopt_long第二个选项被识别为第一个选项的参数

时间:2017-07-14 02:51:11

标签: c getopt-long

int main(int argc , char *argv[])
{
    int c;
    int sock;
    struct sockaddr_in server;
    char message[1000] , server_reply[2000];
    FILE *log;
    //int cp;
    int port_no;

    while(1)
    {
        static struct option long_options[]=
        {
            {"port", required_argument, 0, 'p'},
            {"log", required_argument, 0, 'l'},
        };

        c = getopt_long(argc, argv, "p:l:",long_options,NULL);

        if(c==-1)
        {
            break;
        }
        switch (c)
        {
            case 'p':
                if (optarg)
                {
                    port_no = atoi(optarg);
                }
                else
                {
                    fprintf(stderr,"Usage --port= port number\n");
                }
                break;
            case 'l':
                if(optarg)
                {
                    log = fopen(optarg,"w");
                }
                else
                {
                    fprintf(stderr,"Usage --log= logfilename\n");
                }
                break;
            case '?':
                //fprintf(stderr,"Argument no recognised\n");
                break;
        }
    }
}

当我运行./client --port --log时,它将--log识别为端口号参数,当我运行./client --log --port时,它将--port识别为日志文件参数并创建一个文件名为--port

为什么会这样? --中的getopt_long()不是特殊字符吗?

1 个答案:

答案 0 :(得分:2)

portlog都声明为required_argument。因此,它看起来是--log背后的论点,因此--port被视为arg而不是option

正确的用法类似于./client --port 8080 --log file.log