通常情况下,我们定义的main函数都只有空形参列表:

int main(){...}

然而,有时我们确实需要给mian传递实参,一种常见的情况是用户设置一组选项来确定函数所要执行的操作。例如,假定main函数位于可执行文件prog内,我们可以向程序传递下面的选项:

prog -d -o ofile data

这些命令行选项(即在cmd中输入的)通过两个(也可以是其他任意个)形参传递给main函数:

int main(int argc,char *argv[]){...}

第二个形参argv是一个数组,它的元素是指向C风格字符串的指针;第一个形参argc表示数组中字符串的数量。因为第二个形参是数组,所以main函数也可以定义成:

int main(int argc,char **argv){...}

其中argv指向char*。

当实参传给main函数之后,argv的第一个元素指向程序的名字或者一个空字符串,接下来的元素依次传递给命令行提供的实参,最后一个指针之后的元素保证为0。

以上面提供的命令行为例,argc应该等于5,argv应该包含如下的C风格字符串:

argv[0] = "prog";
argv[1] = "-d";
argv[2] = "-o";
argv[3] = "ofile";
argv[4] = "data";
argv[5] = 0; //这个参数和我们没什么关系,只是为了保证最后一个指针之后的元素为0而已。不用管。

需要传递参数的main函数的程序代码片段如下:

int main(int argc, char **argv)
{
//open and check both files
if (argc != 3) //pass three arguments to main,if not, print an error message
throw runtime_error("wrong number of arguments");
ifstream map_file(argv[1]); //open transformation file
//Note:argv[0] stores C-style characters which is the name of the program that contains main() function,so the fisrt file is stored in argv[1]
if (!map_file) //check that open succeeded
throw runtime_error("no transfrom file");//you don't need to care about it now ifstream input(argv[2]); //open file of text to transform,the second file,also the third parameters in argv
if (!input) //check that open succeeded
throw runtime_error("no input file");
word_transform(map_file, input);
getchar();
//return 1; //exiting main will automatically close the files
} //wu xing zhuang bi, zui wei zhi ming: )

为了运行此程序,我们必须输入main所需的参数,否则会抛出runtime_error异常,甚至出现意想不到的错误。

步骤如下:

  • 打开cmd,用cd命令将当前路径调至带有要编译的cpp文件的目录下。如,假设我要编译的文件为word_transform.cpp,,该文件在G:\C++projects\Githubpath\learnCPP\code\L11 Associative Container\word_transform\word_transform目录下,则输入的命令为
cd G:\C++projects\Githubpath\learnCPP\code\L11 Associative Container\word_transform\word_transform
  • 编译此文件。我使用的编译器版本为gcc 4.9.2,输入的命令为
g++ word_transform.cpp

如果要支持c++ 11,部分编译器需要在后面加上-std=c++0x,如:

g++ word_transform.cpp -std=c++0x
  • 向main函数传递参数。假设包含main函数的文件为word_transform.cpp,要传递的参数为rules和text,那么传递参数的命令为:
word_transform rules text

此处argv[0] = "word_transform",argv[1] = "rules",argv[2] = "text"。


注1:如果要编译多个文件,应将所有文件都编译。例如,假设要编译的文件有test.h,test1.cpp,test2.cpp,textMain.cpp,要传递的参数为hello.txt,则编译的命令为:

g++ test.h test1.cpp,test2.cpp,testMain.cpp -std=c++0x

注2:在包含多个文件的情况下,尽管main函数在testMain.cpp中,调用"testMain hello.txt"也无法成功传入参数。解决办法如下:

由于在Windows系统下将所有文件编译后会生成一个a.exe文件,因此,我们可以向该文件传递参数,命令如下:

a hello.txt

以上就是c++向main函数传递参数的方法了,在UNIX系统中与此有所不同,等以后遇到再说吧。

这篇博文的实例我已上传至github,这是一个文本转换的程序,地址为https://github.com/Larry955/learnCPP/tree/master/code/L11%20Associative%20Container/word_transform

欢迎感兴趣的读者下载。

C++向main函数传递参数的方法(实例已上传至github)的更多相关文章

  1. Java中eclipse与命令行向main函数传递参数

    我们知道main函数是java程序的入口,main函数的参数类型是String[]. 1.Eclipse中向main方法传递参数 例如: public class Mytest { public st ...

  2. node.js获取请求参数的方法和文件上传

    var http=require('http') var url=require('url') var qs=require('querystring') http.createServer(onRe ...

  3. Spark Submit给jar包中的main函数传递参数

    1 示范 spark-submit --master xxx demo.jar "arg1" "arg2" 运行的jar包和传参放在最后,就可以了

  4. 使用ioctl向linux内核传递参数的方法实例

    该篇实例是摘自网络(无法追根溯源倒低是哪位"前"辈写的了) 一.应用层 uint16 data16; if ((fd = socket(AF_INET, SOCK_STREAM, ...

  5. 最简单方法将项目上传到github

    准备材料: 1.首先你需要一个github账号,所有还没有的话先去注册吧!https://github.com/ 2.我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可:ht ...

  6. python 函数传递参数的多种方法

    python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...

  7. 探寻main函数的“标准”写法,以及获取main函数的参数、返回值

    main函数表示法        很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...

  8. jsp中四种传递参数的方法

    jsp中四种传递参数的方法如下: 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="i ...

  9. Jsp传递参数的方法

    今天老师讲了jsp中四种传递参数的方法,我觉得总结一下,挺好的,以备后用! 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超 ...

随机推荐

  1. html+css 知识整理

    1.学网页最好的方法:学习别人的网页. 2.文档结构 <html>(超文本标记语言) <head>  <title>     </title>    & ...

  2. PERL 学习

    http://ju.outofmemory.cn/entry/193944 http://blog.sina.com.cn/s/blog_6a6c136d0101dlcw.html http://bl ...

  3. spring security源码分析之一springSecurityFilterChain

    1. spring和spring security的集成,配置web.xml如下: <context-param> <param-name>contextConfigLocat ...

  4. C#.net 获取当前应用程序所在路径及环境变量

    一.获取当前文件的路径 string str1=Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名. string st ...

  5. 【IT名人堂】何云飞:阿里云数据库的架构演进之路

    [IT名人堂]何云飞:阿里云数据库的架构演进之路 原文转载自:IT168 ​ 如果说淘宝革了零售的命,那么DT革了企业IT消费的命.在阿里巴巴看来,DT时代,企业IT消费的模式变成了“云服务+数据”, ...

  6. 在C#中使用NPOI2.0操作Excel2003和Excel2007

    Excel2003: #region Excel2003 /// <summary> /// 将Excel文件中的数据读出到DataTable中(xls) /// </summary ...

  7. ls与dir的区别

    1.ls具有上色的效果,dir没有. 2.ls是unix/linux系列的命令,dir是dos/windows系列的命令.

  8. 解决ThinkPHP开启APP_DEBUG=>false时报错的问题

    最近用ThinkPHP开发一个项目,本地开发测试完成上传到服务器后,第一次打开正常,再刷新页面时就出现 “页面调试错误,无法找开页面,请重试”的错误,我就郁闷啦,明明本地设置define('APP_D ...

  9. Oracle数据库查看执行计划

    基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

  10. UISearchDisplayController隐藏navigationBar需注意

    不能调用self.navigationController.navigationBar.hidden = YES: 调用此代码的话,你隐藏了navigationBar搜索展示控制器就拿不到导航条:就会 ...