必备技能:5.10:通过命令行给main()函数传递参数
有时候我们需要在运行一个程序的时候就为其传入一些信息。通常,这是通过命令行给main()函数传递参数来完成的。命令行参数就是在系统命令行上紧跟在程序名称后面的信息。(windows上,Run命令同样使用的是命令行参数)。例如,我们可以采用下面的命令来从命令行编译一个C++程序:
cl prog-name
其中,prog-name就是我们想要编译程序的名称。程序的名字被作为命令行参数传递给了C++编译器。
C++中定义了main()函数有两个内置的,也是可选的参数。它们是:argc和argv。它们是用来接收命令行参数的。它们也是C++中为main()函数定义的唯一一种参数。然而,由于操作系统的不同,main()函数还有可能有别的参数,这点需要查阅编译器的相关文档。下面让我们仔细研究一下argc 和argv。
注意:从技术上来讲,命令行参数的名称可以是任意的,我们可以使用任何自己喜欢的名称。然而,多年来,人们一直都是用argc和argv这两个名称,建议我们最好也都是用这两个名称,这样代码的阅读者就能方便地确认到它们是用来接收命令行参数的。
argc变量是一个整型数,它用来存放命令行参数的数量。它的取值至少是1,这是因为程序的名称就是作为第一个参数的。
argv参数是一个指向字符指针数组的指针。argv数组中的每个指针都指向一个命令行的字符串形式的参数。指针argv[0]指向程序的名称;argv[1]指向第一个参数,argv[2]指向第二个参数;以此类推。所有的参数都是以字符串的形式传递到main()函数中的,所以数值的参数必须由我们自己的程序转换成内部所需的形式。
正确地声明argv参数也是很重要的。最常用的形式如下:
char *argv[];
我们可以通过对argv进行索引而访问到每个参数。下面的程序演示了如何使用命令行参数。程序输出了所有命令行参数。
//打印命令行参数
#include <iostream>
using namespace std;
int main(int argc, char *argv[] )
{
for ( int i = 1; i < argc; i++ )
{
cout << argv[i] << "\n";
}
return 0;
}
我们假设上面的程序名称为ComLine,则从命令行执行它的情况会是如下:
C:/>ComLine one two three
one
two
three
C++并没有规定命令行参数的含义,因为这个是随着操作系统的不同而不同的。然而,最普遍的一个传统是这样的:每个命令行参数必须有空格或者制表符间隔。常用的逗号,分号等都不是有效的参数分隔符。如下:
one,two,and three
是由四个字符串组成的,但是作为命令行参数的时候却是两个字符串。这是因为逗号不是有效的间隔符。
如果我们确实需要传递还有空格的字符串参数,那么我们必须把这个字符串用引号引起来。如下,下面的方式将被认为是一个命令行参数:
“this is one argument”
请记住,这里提供的示例有着很广泛的使用范围。但是并不一定全部都适用于你所使用的系统。
通常,我们使用argc和argv来为程序获取初始选项或者初始值,例如一个文件名称。在C++中,命令行参数的数量是可以和你操作系统支持的数量一样多的。使用命令行参数会使得我们的程序显得非常专业,也方便在批处理程序中使用我们的程序。
通过命令行参数传入数值型的参数
当我们通过命令行参数把数值型数据传入到程序中的时候,数值将会被以字符串的形式接收。我们的程序需要使用C++标准库函数中的函数来把这些字符串转换为二进制的,内部格式的数据。下面给出了处理这种情况时最常用的三个函数:
atof | 把字符串转换为一个double类型的数据,返回其结果 |
atol | 把字符串转换为一个long int类型的数据,返回其结果 |
atoi | 把字符串转换为一个int类型的数据,返回其结果 |
上面的每个函数都是接收一个含有数值的字符串作为参数,它们使用的头文件是<cstdlib>。
下面的程序演示了如何把数值型的命令行参数转换为响应的二进制数值。程序计算命令行参数中跟在程序名称后面的两个数值的和。其中使用到了函数atof()来把数值参数转换为相应的内部表示方式。
//这个程序把命令行的两个数值型参数相加,并输出结果
#include <iostream>
#include <cstdlib>
using namespace std;
int main( int argc, char *argv[] )
{
double a,b;
if (argc!=3)
{
cout << "Usage: add num num\n";
return 1;
}
a = atof(argv[1]);
b = atof(argv[2]);
cout << a+b;
return 0;
}
假设程序的名称为add,那么使用命令行来计算两个数的和如下:
C:/>add 100.2 231
331.2