读取命令行参数

33

我写了一个小程序来计算圆周率(π),通过积分方式。现在我面临一个问题,如何扩展程序以计算一个额外的参数给定的积分,当启动应用程序时。我该如何在程序中处理这样的参数?


那么你的问题真的只是关于命令行参数吗? - wkl
是的,然后我不知道在实际程序中如何处理它,如果我将其读取为char,然后转换为int进行计算?这就是我不理解的部分。 - Waypoint
1
http://pubs.opengroup.org/onlinepubs/009695399/functions/getopt.html - Zimbabao
1
将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文本: - occulus
4个回答

73

当你编写主函数时,通常会看到以下两种定义:

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

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

main 函数的参数如下:

  • int argc - 在运行程序时传递给程序的参数数目,至少为1
  • char **argv - 它是一个指向 char * 的指针。它也可以是这样的形式:char *argv[],表示“char * 数组”。这是一个 C 风格字符串指针数组。

基本示例

例如,您可以使用以下代码打印出传递给 C 程序的参数:

#include <stdio.h>

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

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

所以基本上,如果你想要一个单一的参数,你可以这样写...

./myprogram integral


一个简单的例子

你可以检查argv[1]是否是integral,比如使用strcmp("integral", argv[1]) == 0

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

#include <stdio.h>
#include <string.h>

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这样的库。


3
#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
在上面的回答中解释的原始方式解析命令行参数是合理的,只要你需要处理的参数数量不太多。
我强烈建议您使用一个专业的库来处理命令行参数。
这将使您的代码更加专业。
C++ 的这样一个库可以在以下网站中找到。我在我的许多项目中都使用了这个库,因此我可以自信地说,这是一款易于使用但有用的命令行参数解析库之一。此外,由于它只是一个模板库,所以更容易导入到您的项目中。 http://tclap.sourceforge.net/ 同样,C 也有类似的库。 http://argtable.sourceforge.net/

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接