通常情况下,我们定义的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. cocos2d-x make: *** [clean-box2d_static-armeabi] Error 1

    /cygdrive/d/android-ndk-r8e/build/core/build-binary.mk:52: recipe for target `clean-cocos_curl_stati ...

  2. js json与对象的相互转换

    var str = '{ "name": "cxh", "sex": "man" }'; //JSON字符串:var o ...

  3. shell 学习笔记

    <Linux命令行与shell脚本编程大全>笔记   wkss 其他:http://www.cnblogs.com/pengdonglin137/p/3528303.html 一.基本命令 ...

  4. android 搭建开发环境

    法一.直接集成的ADT+ECLIPSE 还有64位的jdk即可 法二.EClipse装好后,下载好SDK,ADT(在线或离线装) sdk下载后,点sdk.exe 文件. 如果更新失败,解决方法如下 C ...

  5. .net中的多线程

    一.多线程的概念        什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的,线程是程序中的一个执行流, ...

  6. Amazon 开始接受 Windows 礼品卡预订

    在 8 月微软虚拟货币系统 Microsoft Points 已经正式被真实货币替代,但目前,配套真实货币系统将推出的礼品卡还并没有开始销售.Amazon 上的一则预订显示“Windows 礼品卡”( ...

  7. c#入门实例

    1.概述 C#是一个语言,.net是一个平台,上面支持用C#或者VB.Net写代码 2.注释 若注释量较少用  //   开头,大量用   /*    */    表示 输出结果 3.命名空间 所谓n ...

  8. 转: 关于 ssl的建立链接的过程

    转自:  http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html SSL/TLS协议运行机制的概述   作者: 阮一峰 日期: 2014年2月 5日 互 ...

  9. PHP分页

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. MVC3 Razor视图引擎的基础语法

    好久没有关注微软的开发了,今天看到了MVC3,顺便学习学习,我觉得Razor是个不错的做法,比使用<%%>简单多了,而且好看.首先“_”开头的cshtml文档将不能在服务器上访问,和asp ...