C - 读取命令行参数

Way*_*int 18 c

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

wkl*_*wkl 47

编写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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

[birryree@lilun c_code]$ gcc -std=c99 args.c
Run Code Online (Sandbox Code Playgroud)

现在运行它......

[birryree@lilun c_code]$ ./a.out hello there
argv[0]: ./a.out
argv[1]: hello
argv[2]: there
Run Code Online (Sandbox Code Playgroud)

所以,你可以看到,在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.
    }
}
Run Code Online (Sandbox Code Playgroud)

更好的命令行解析

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