C - 读取命令行参数

时间:2011-03-01 16:31:20

标签: c

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

4 个答案:

答案 0 :(得分:45)

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

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

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

main的论据是:

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

基本示例

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

char *

我正在使用GCC 4.5编译一个名为#include <stdio.h> int main(int argc, char **argv) { for (int i = 0; i < argc; ++i) { printf("argv[%d]: %s\n", i, argv[i]); } } 的文件。它将编译并构建一个默认的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 中,argv是你运行的程序的名称(这不是标准定义的行为,但是很常见。你的参数从argv[0]开始以及。

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

argv[1]


一个简单的案例

您可以查看./myprogram integralargv[1],也许是integral

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

strcmp("integral", argv[1]) == 0

更好的命令行解析

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

答案 1 :(得分:2)

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

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;
}

答案 2 :(得分:2)

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

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

这将使您的代码更专业。

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

C也可以使用类似的库。 http://argtable.sourceforge.net/

答案 3 :(得分:1)

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

您可以查看on Wikipedia Argument-parsing helpers for C/Unix