cli options parser 发表于 2016-03-06 更新于 2023-02-21 实现 123456789101112131415161718192021222324252627282930313233343536373839#include <string.h>struct cmdopt { const char * name; int argnums; int (*handle)(const struct cmdopt *, const char **, void *);};int cmdarg_parse(int argc, const char **argv, const struct cmdopt *opts, int optnums, void *data){ int i; int j; int r; const char *arg; for (i = 0; i < argc; i++) { arg = argv[i]; if (arg[0] != '-') { break; } for (j = 0; j < optnums; j++) { if (strcmp(&arg[1], opts[j].name) == 0) { break; } } if (j == optnums) { break; } if ((argc - i - 1) < opts[j].argnums) { break; } r = opts[j].handle(&opts[j], &argv[i + 1], data); if (r == 0) { break; } i += opts[j].argnums; } return i;} 使用1234567891011121314151617181920212223242526static int arg_handle(const struct cmdopt *opt, const char **argv, void *data);const struct cmdopt options[] = { { "h", 1, arg_handle }, { "p", 1, arg_handle }};static int arg_handle(const struct cmdopt *opt, const char **argv, void *data){ printf("%s %s %p\n", opt->name, argv[0], data); return opt->argnums;}int main(int argc, const char **argv){ cmdarg_parse(argc - 1, &argv[1], options, 2, NULL); return 0;}