通常情况下,我们定义的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. vsftpd虚拟用户创建实例(转载)

    vsftpd虚拟用户创建实例 发布:theboy   来源:net     [大 中 小] vsftpd虚拟用户创建实例,有需要的朋友可以参考下.  vsftpd虚拟用户创建实例,有需要的朋友可以参考 ...

  2. linux修改history

    1.cat ~/.bash_history cat -n  ~/.bash_history [以行数的形式查看] 2.history | more Enter 键盘  ----------一行一行 空 ...

  3. Localizing WPF with .resx files

    WPF用Resource.resX中的字符串进行国际化 增加命名空间 xmlns:prop="clr-namespace:XXAppName.Properties" 引用的地方的格 ...

  4. H - Frequent values

    Problem F: Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasi ...

  5. ios优化复制大文件时,如何使内存运用最少且效率最高

    我也是纠结了好几天,我想自己想个办法,但是数据复制不上去,我现在还不明白,如果有人知道我错在哪了,请留言,如果还有更好的方法,请分享共同进步. ____________________________ ...

  6. 一道简单的动态规划题目——House Robber

    一.题目 House Robber(一道Leetcode上的关于动态规划的简单题目)具体描述如下: There is a professional robber planning to rob hou ...

  7. 怒刷DP之 HDU 1176

    免费馅饼 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  8. jQuery选择器之内容过滤选择器Demo

    测试代码: 04-内容过滤选择器.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  9. Java操作文件夹的工具类

    Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...

  10. hdu 3308 LCIS 线段树

    昨天热身赛的简单版:LCIS.昨天那题用树链剖分,不知道哪里写错了,所以水了水这题看看合并.更新方式是否正确,发现没错啊.看来应该是在树链剖分求lca时写错了... 题目:给出n个数,有两种操作: 1 ...