【问题标题】:C - reading command line parametersC - 读取命令行参数
【发布时间】:2011-07-06 15:40:27
【问题描述】:

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

【问题讨论】:

  • 那么你的问题真的只是关于命令行参数吗?
  • 是的,然后我不知道如何在实际程序中处理它,如果我读取为 char 而不是将其传输到 int 进行计算?只是这是不明白的部分
  • (编辑标题以使其更合适)

标签: c


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,这是我可以建立的东西,太棒了
【解决方案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;
}

【讨论】:

    【解决方案3】:

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

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

    这将使您的代码更加专业。

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】: