让gcc getopt示例接受长参数?

让gcc getopt示例接受长参数?,c,gcc,getopt-long,C,Gcc,Getopt Long,我正在尝试让以下命令与该命令一起工作 rectangle –area –length 12 –breadth 34 但是我得到了错误 rectangle: invalid option -- r 使用短参数选项 rectangle -a -l 12 -b 34 我得到了正确的答案 Area: 408 守则: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <g

我正在尝试让以下命令与该命令一起工作

rectangle –area –length 12 –breadth 34
但是我得到了错误

rectangle: invalid option -- r
使用短参数选项

rectangle -a -l 12 -b 34
我得到了正确的答案

Area: 408
守则:

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

/** Program to calculate the area and perimeter of 
 * a rectangle using command line arguments
 */
void print_usage() {
    printf("Usage: rectangle [ap] -l num -b num\n");
}

int main(int argc, char *argv[]) {
    int opt= 0;
    int area = -1, perimeter = -1, breadth = -1, length =-1;

    //Specifying the expected options
    //The two options l and b expect numbers as argument
    static struct option long_options[] = {
        {"area",      no_argument,       0,  'a' },
        {"perimeter", no_argument,       0,  'p' },
        {"length",    required_argument, 0,  'l' },
        {"breadth",   required_argument, 0,  'b' },
        {0,           0,                 0,  0   }
    };

    int long_index =0;
    while ((opt = getopt_long(argc, argv,"apl:b:", 
                   long_options, &long_index )) != -1) {
        switch (opt) {
             case 'a' : area = 0;
                 break;
             case 'p' : perimeter = 0;
                 break;
             case 'l' : length = atoi(optarg); 
                 break;
             case 'b' : breadth = atoi(optarg);
                 break;
             default: print_usage(); 
                 exit(EXIT_FAILURE);
        }
    }
    if (length == -1 || breadth ==-1) {
        print_usage();
        exit(EXIT_FAILURE);
    }

    // Calculate the area
    if (area == 0) {
        area = length * breadth;
        printf("Area: %d\n",area);
    }

    // Calculate the perimeter
    if (perimeter == 0) {
        perimeter = 2 * (length + breadth);
        printf("Perimeter: %d\n",perimeter);
    }
    return 0;
}
#包括
#包括
#包括
#包括
/**程序来计算的面积和周长
*使用命令行参数的矩形
*/
无效打印_用法(){
printf(“用法:矩形[ap]-l num-b num\n”);
}
int main(int argc,char*argv[]){
int opt=0;
内部面积=-1,周长=-1,宽度=-1,长度=-1;
//指定预期选项
//两个选项l和b期望数字作为参数
静态结构选项长_选项[]={
{“area”,无_参数,0,'a'},
{“周长”,无_参数,0,'p'},
{“length”,必选参数,0,'l'},
{“宽度”,必选参数,0,'b'},
{0,           0,                 0,  0   }
};
int long_指数=0;
而((opt=getopt_long)(argc,argv,“apl:b:”,
long_选项和long_索引)!=-1){
开关(opt){
案例“a”:面积=0;
打破
案例“p”:周长=0;
打破
案例“l”:长度=atoi(optarg);
打破
案例“b”:宽度=atoi(optarg);
打破
默认值:print_usage();
退出(退出失败);
}
}
如果(长度==-1 | |宽度==-1){
打印_用法();
退出(退出失败);
}
//计算面积
如果(面积==0){
面积=长度*宽度;
printf(“区域:%d\n”,区域);
}
//计算周长
如果(周长==0){
周长=2*(长+宽);
printf(“周长:%d\n”,周长);
}
返回0;
}

长选项的前缀必须是
--
而不是单个
-

所以

应该有用

更新

也可以使用以下表格:

rectangle –-area –-length=12 –-breadth=34

您可能希望通过更改以下内容来更正用法声明:

printf("Usage: rectangle [ap] -l num -b num\n");


我得到了
用法:矩形[ap]-l num-b num
我尝试了
矩形--面积--长度12--宽度34
得到了
用法:矩形[-a |--面积--p |--周长]-l |--长度num-b |--宽度num
我尝试了你的更新为
矩形--面积--长度=12--宽度=34
,我仍然得到了
用法:矩形[-a |--面积-p |--周长]-l |--长度数值-b |--宽度数值
printf("Usage: rectangle [ap] -l num -b num\n");
printf("Usage: rectangle [-a|--area -p|--perimeter] -l|--length num -b|--breadth num\n");