getopt() && getopt_long()

c语言命令行,常用到getopt_long和getopt两个函数,在此做个记录
getopt()
getopt函数是一个用于解析命令行参数的C标准库函数,通常与头文件一起使用
int getopt(int argc, char * const argv[], const char *optstring)
这是getopt()函数的原型。它接受命令行参数的数量argc,以及参数数组argv[]和表示期望选项的字符串optstring。

optstring:参数是一个包含所有可能选项字符的字符串。如果一个选项后跟有冒号:,则表示该选项需要一个参数。例如,"i:o:v"表示选项i、o和v,其中i和o后面需要参数。

getopt()函数会在每次调用时返回下一个选项字符。如果选项需要参数,则参数值可以通过全局变量optarg获取。函数会根据命令行参数中的选项进行迭代,直到没有更多选项为止,此时返回-1。

 
函数使用demo:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    int opt;
    double num1 = 0.0;
    double num2 = 0.0;
    char operation = '\0';

    while ((opt = getopt(argc, argv, "a:b:cdef")) != -1) {
        switch (opt) {
            case 'a':
                num1 = atof(optarg);
                break;
            case 'b':
                num2 = atof(optarg);
                break;
            case 'c':
                operation = 'c'; // 加法
                break;
            case 'd':
                operation = 'd'; // 减法
                break;
            case 'e':
                operation = 'e'; // 乘法
                break;
            case 'f':
                operation = 'f'; // 除法
                break;
            default:
                fprintf(stderr, "Usage: %s -a <number> -b <number> -c|-d|-e|-f\n", argv[0]);
                return 1;
        }
    }

    if (operation == '\0') {
        fprintf(stderr, "请选择要执行的操作\n");
        return 1;
    }

    // 执行相应的操作
    switch (operation) {
        case 'c':
            printf("%lf + %lf = %lf\n", num1, num2, num1 + num2);
            break;
        case 'd':
            printf("%lf - %lf = %lf\n", num1, num2, num1 - num2);
            break;
        case 'e':
            printf("%lf * %lf = %lf\n", num1, num2, num1 * num2);
            break;
        case 'f':
            if (num2 != 0) {
                printf("%lf / %lf = %lf\n", num1, num2, num1 / num2);
            } else {
                fprintf(stderr, "除数不能为零\n");
                return 1;
            }
            break;
    }

    return 0;
}
使用如下:

 

getopt_long()
当需要处理较长的命令行选项时,建议使用getopt_long()函数来解析命令行。getopt_long()函数与getopt()函数类似,但允许使用长选项名称
getopt_long()函数是一个用于解析命令行选项的函数,其定义如下:
#include <getopt.h> 

int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
getopt_long()函数的参数包括:
  • argc:命令行参数个数;
  • argv:命令行参数数组;
  • optstring:指定短命令的字符串,每个字符代表一个选项;
  • longopts:指向一个struct option类型的数组,其中每个元素表示一个长选项;
  • longindex:一个指向整数的指针,表示当前处理的长选项的索引位置;
getopt_long()函数会依次解析命令行选项,并返回下一个选项字符。如果所有选项都已经解析完毕,则返回-1。
在使用getopt_long()函数时,可以通过设定长选项和短选项,来指定命令行参数的格式。其中,短选项使用单个字符表示,长选项使用字符串表示,通常以两个连字符(--)开头。
长选项需要定义为一个struct option类型的数组,其中每个元素表示一个长选项。
struct option结构体的定义如下:
struct option { 
    const char *name; // 选项名称 
    int has_arg; // 是否需要参数 
    int *flag; // 如果非NULL,则返回值是一个flag,不再返回val 
    int val; // 选项对应的字符值 
};
在struct option结构体中,
name表示选项名称,has_arg表示是否需要参数(0表示不需要,1表示需要,2表示可选),flag和val用于指定选项对应的字符值。
如果需要解析长选项,可以在optstring参数中使用冒号(:)来标识。例如,如果需要解析一个名为--input的选项,并要求该选项有一个参数,则可以将optstring参数设置为"i:"。
函数使用demo:
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

int main(int argc, char *argv[]) {
    int opt;
    int option_index = 0;
    double num1 = 0.0;
    double num2 = 0.0;
    char operation = '\0';

    static struct option long_options[] = {
        {"num1", required_argument, 0, 'a'},
        {"num2", required_argument, 0, 'b'},
        {"add", no_argument, 0, 'c'},
        {"subtract", no_argument, 0, 'd'},
        {"multiply", no_argument, 0, 'e'},
        {"divide", no_argument, 0, 'f'},
        {0, 0, 0, 0}
    };

    while ((opt = getopt_long(argc, argv, "a:b:cdef", long_options, &option_index)) != -1) {
        switch (opt) {
            case 'a':
                num1 = atof(optarg);
                break;
            case 'b':
                num2 = atof(optarg);
                break;
            case 'c':
                operation = 'c'; // 加法
                break;
            case 'd':
                operation = 'd'; // 减法
                break;
            case 'e':
                operation = 'e'; // 乘法
                break;
            case 'f':
                operation = 'f'; // 除法
                break;
            default:
                fprintf(stderr, "Usage: %s --num1 <number> --num2 <number> --add|--subtract|--multiply|--divide\n", argv[0]);
                return 1;
        }
    }

    if (operation == '\0') {
        fprintf(stderr, "请选择要执行的操作\n");
        return 1;
    }

    // 执行相应的操作
    switch (operation) {
        case 'c':
            printf("%lf + %lf = %lf\n", num1, num2, num1 + num2);
            break;
        case 'd':
            printf("%lf - %lf = %lf\n", num1, num2, num1 - num2);
            break;
        case 'e':
            printf("%lf * %lf = %lf\n", num1, num2, num1 * num2);
            break;
        case 'f':
            if (num2 != 0) {
                printf("%lf / %lf = %lf\n", num1, num2, num1 / num2);
            } else {
                fprintf(stderr, "除数不能为零\n");
                return 1;
            }
            break;
    }

    return 0;
}
使用如下:
0
 
posted @ 2024-02-25 00:00  lethe1203  阅读(117)  评论(0编辑  收藏  举报