我写了一个小程序来计算圆周率(π),通过积分方式。现在我面临一个问题,如何扩展程序以计算一个额外的参数给定的积分,当启动应用程序时。我该如何在程序中处理这样的参数?
我写了一个小程序来计算圆周率(π),通过积分方式。现在我面临一个问题,如何扩展程序以计算一个额外的参数给定的积分,当启动应用程序时。我该如何在程序中处理这样的参数?
当你编写主函数时,通常会看到以下两种定义:
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
这样的库。
#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;
}