您的位置:首页 > 大数据 > 人工智能

如何给main函数传递参数并执行

2014-12-10 10:23 731 查看


1. main函数的参数

C++标准允许主函数main()有或没有参数列表。 您能在主函数main()中使用一个或更多的参数。 如下是一些惯例:


int main(int argc, char *argv[ ])

第二个形参是一个C风格字符串数组,故也可以写成**argv。它的元素是字符串,也是传递给main函数的参数,而且第一个元素通常是程序的名字。

第一个形参argc是传递给main函数的参数的个数,即第二个形参字符串数组中元素的个数。如:

有一个名为prog的main函数,如果额外传递给它的参数是-d,-o,ofile,data0,那么

argv[0]="prog";//main函数名默认是第一个参数

argv[1]="-d";

argv[2]="-o";

argv[3]="ofile";

argv[4]="data0";

而argc=5;//注意不是4,而是5,不要忘记main函数名也是参数

注意:

argc代表的是传递个main函数的参数个数;

main函数名是第一个参数;

argv[]是一个C风格字符串数组,要想使用非字符串需在main函数体中另行处理。

2. 如何给main函数传递参数并执行呢?

举例如下:

编写一个主函数main,使用两个int型值作为实参,并输出传递给main的实参的值和它们的和。

#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc,char *argv[])
{
if(argc!=3)//判断参数个数是否符合要求,注意是3,不是2,因为程序名是第一个参数
{
cout<<"You should use 3 arguments"<<endl;
return -1;
}
cout<<"传递给main函数的参数是:"<<endl;
for(int i=0;i!=argc;++i)
cout<<argv[i]<<endl;
//计算两个int型实参的和
int argument1=atoi(argv[1]);//atoi()是把字符串转换成长整型数的一种函数,在头文件<cstdlib>
//因为main函数的参数是C风格字符串,故需要转换
int argument2=atoi(argv[2]);
int Add=argument1+argument2;//求和
cout<<"The sum of "<<argv[1]<<" and "
<<argv[2]<<" is "<<Add<<endl;
return 0;
}
注意上述程序中,用了一个atoi()函数,它是把字符串转换成长整型数的一种函数。因为传递给main函数的参数是字符串,而我们要求两个int型值的和,故需要转换。

采用VS2010,编译并保存。此时,你在程序目录下发现一个可执行文件.exe(位于项目所属的解决方案文件夹下的Debug文件夹中,而非项目文件夹下的Debug文件夹中)。在我的目录下,它是project.exe,与项目名一致。如果你的main函数源文件名与项目名不一致,则生成的.exe是项目名。

下面我们用两种方法传递参数并执行.exe文件,假设两个int型实参是3和7:



利用VS2010

右击项目名,点击属性,依次选择【配置属性|调试|命令参数】,在命令参数中直接输入参数3和7(不用输入第一个参数,即程序名),中间用空格隔开,然后点击【确定】,如下图:


最后,按Ctrl+F5(直接执行不调试)执行,结果如下:



用windows自带的cmd命令

在Windows【开始|附件|命令提示符】下打开cmd窗口,进入上述可执行文件project.exe所在的目录,然后输入3个参数:project 3 7

(这次必须输入第一个参数,即程序名),然后点击回车键,结果如下:



3.为什么要给main函数传递参数?



之所以要给main函数传递参数,是考虑多进程的情况。每一个main函数执行就是一个单独的进程。


比如进程1启动进程2,就需要给进程2传参数。可以看看CreateProcess函数。
同样进程结束后,需要知道返回值,来判断子进程执行是否成功,所以main函数最好有返回值。


比如编译后生成a.exe


process 1:


do sosomething


// Linux和Window平台的CreateProcess会有不同,具体请搜索
ret = CreateProcess 2("a.exe", p1, p2, p3, ...)// p1, p2, p3会作为参数传给a.exe的main


if (ret != 0) {
process 2 failed.


}
...


do something



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: