C – 读取命令行参数

我做了很少的程序来计算pi(π)作为一个整体。 现在我面临一个问题如何扩展它以计算积分,这将在启动应用程序时作为额外参数给出。 我如何在程序中处理这样的参数?

编写main函数时,通常会看到以下两种定义之一:

  • int main(void)
  • int main(int argc, char **argv)

第二种forms允许您访问传递给程序的命令行参数,以及指定的参数数量(参数由空格分隔)。

main论点是:

  • int argc – 运行时传递给程序的参数数量。 它至少是1
  • char **argv – 这是一个指向char *的指针。 它也可以是: char *argv[] ,意思是’ char * ‘数组。 这是一个C样式字符串指针数组。

基本例子

例如,您可以执行此操作以打印传递给C程序的参数:

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

我正在使用GCC 4.5编译一个名为args.c的文件。 它将编译并构建一个默认的a.out可执行文件。

 [birryree@lilun c_code]$ gcc -std=c99 args.c 

现在运行它......

 [birryree@lilun c_code]$ ./a.out hello there argv[0]: ./a.out argv[1]: hello argv[2]: there 

所以你可以看到在argvargv[0]是你运行的程序的名称(这不是标准定义的行为,但是很常见。你的参数从argv[1]开始。

所以基本上,如果你想要一个参数,你可以说......

./myprogram integral


一个简单的案例

你可以检查argv[1]integral ,也许像strcmp("integral", argv[1]) == 0

所以在你的代码中......

 #include  #include  int main(int argc, char **argv) { if (argc < 2) // no arguments were passed { // do something } if (strcmp("integral", argv[1]) == 0) { runIntegral(...); //or something } else { // do something else. } } 

更好的命令行解析

当然,这一切都非常简陋,随着程序变得越来越复杂,您可能需要更高级的命令行处理。 为此,您可以使用像GNU getopt这样的库。

只要您需要处理的参数数量不是太多,以上述方式解释的原始方式解析命令行参数是合理的。

我强烈建议您使用工业强度库来处理命令行参数。

这将使您的代码更专业。

这样的C ++库可以在以下网站上找到。 我在很多项目中都使用过这个库,因此我可以自信地说这是一个最简单但最有用的命令行参数解析库。 此外,由于它只是一个模板库,因此可以更轻松地导入到项目中。 http://tclap.sourceforge.net/

类似的库也可用于C语言。 http://argtable.sourceforge.net/

 #include  #include  int main(int argc, char **argv) { int i, parameter = 0; if (argc >= 2) { /* there is 1 parameter (or more) in the command line used */ /* argv[0] may point to the program name */ /* argv[1] points to the 1st parameter */ /* argv[argc] is NULL */ parameter = atoi(argv[1]); /* better to use strtol */ if (parameter > 0) { for (i = 0; i < parameter; i++) printf("%d ", i); } else { fprintf(stderr, "Please use a positive integer.\n"); } } return 0; } 

还有一个C标准内置库来获取命令行参数:getopt

您可以在Wikipedia上或在C / Unix的Argument-parsing helpers中进行检查。