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
所以你可以看到在argv
, argv[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中进行检查。