从命令行将parameter passing给C程序

所以我在Linux中,我想要一个程序接受参数,当你从命令行执行它。

例如,

./myprogram 42 -b -s

那么程序会把这个数字42存储为一个int,并根据它得到的参数-b或-s来执行某些代码部分。

你可以使用getopt 。

  #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (int argc, char **argv) { int bflag = 0; int sflag = 0; int index; int c; opterr = 0; while ((c = getopt (argc, argv, "bs")) != -1) switch (c) { case 'b': bflag = 1; break; case 's': sflag = 1; break; case '?': if (isprint (optopt)) fprintf (stderr, "Unknown option `-%c'.\n", optopt); else fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); return 1; default: abort (); } printf ("bflag = %d, sflag = %d\n", bflag, sflag); for (index = optind; index < argc; index++) printf ("Non-option argument %s\n", argv[index]); return 0; } 

在C中,这是通过传递给main()函数的参数完成的:

 int main(int argc, char *argv[]) { int i = 0; for (i = 0; i < argc; i++) { printf("argv[%d] = %s\n", i, argv[i]); } return 0; } 

更多的信息可以在网上find,比如这篇主要文章的论点 。

考虑使用getopt_long() 。 它允许任何组合的短期和长期的select。

 #include <stdio.h> #include <stdlib.h> #include <getopt.h> /* Flag set by `--verbose'. */ static int verbose_flag; int main (int argc, char *argv[]) { while (1) { static struct option long_options[] = { /* This option set a flag. */ {"verbose", no_argument, &verbose_flag, 1}, /* These options don't set a flag. We distinguish them by their indices. */ {"blip", no_argument, 0, 'b'}, {"slip", no_argument, 0, 's'}, {0, 0, 0, 0} }; /* getopt_long stores the option index here. */ int option_index = 0; int c = getopt_long (argc, argv, "bs", long_options, &option_index); /* Detect the end of the options. */ if (c == -1) break; switch (c) { case 0: /* If this option set a flag, do nothing else now. */ if (long_options[option_index].flag != 0) break; printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case 'b': puts ("option -b\n"); break; case 's': puts ("option -s\n"); break; case '?': /* getopt_long already printed an error message. */ break; default: abort (); } } if (verbose_flag) puts ("verbose flag is set"); /* Print any remaining command line arguments (not options). */ if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); putchar ('\n'); } return 0; } 

有关:

  • 你喜欢哪种命令行命令风格?
  • Unix shell命令的一般语法是什么?

看看getopt库; 这几乎是这种事情的黄金标准。

其他人打了这个头:

  • main(int argc, char **argv)的标准参数使您可以直接访问命令行(在shell被破坏和标记之后)
  • 有非常标准的工具来parsing命令行: getopt()getopt_long()

但正如你所看到的,使用它们的代码有点罗嗦,而且颇具代表性。 我通常用类似的东西推出它:

 typedef struct options_struct { int some_flag; int other_flage; char *use_file; } opt_t; /* Parses the command line and fills the options structure, * returns non-zero on error */ int parse_options(opt_t *opts, int argc, char **argv); 

然后主要是:

 int main(int argc, char **argv){ opt_t opts; if (parse_options(&opts,argc,argv)){ ... } ... } 

或者,您可以使用C / UNIX的参数parsing助手中提供的解决scheme之一。

除了getopt() ,您还可以考虑使用argp_parse() (对同一个库的另一个接口)。

从libc手册 :

getopt更为标准(仅限短版本是POSIX标准的一部分),但对于非常简单和非常复杂的选项结构,使用argp_parse通常更容易,因为它为您完成了更多的肮脏工作。

但是我对标准getopt总是很满意。

注意getopt_long GNU getopt是GNU LGPL。