C++向main函数传递参数的方法(实例已上传至github)
通常情况下,我们定义的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)的更多相关文章
- Java中eclipse与命令行向main函数传递参数
我们知道main函数是java程序的入口,main函数的参数类型是String[]. 1.Eclipse中向main方法传递参数 例如: public class Mytest { public st ...
- node.js获取请求参数的方法和文件上传
var http=require('http') var url=require('url') var qs=require('querystring') http.createServer(onRe ...
- Spark Submit给jar包中的main函数传递参数
1 示范 spark-submit --master xxx demo.jar "arg1" "arg2" 运行的jar包和传参放在最后,就可以了
- 使用ioctl向linux内核传递参数的方法实例
该篇实例是摘自网络(无法追根溯源倒低是哪位"前"辈写的了) 一.应用层 uint16 data16; if ((fd = socket(AF_INET, SOCK_STREAM, ...
- 最简单方法将项目上传到github
准备材料: 1.首先你需要一个github账号,所有还没有的话先去注册吧!https://github.com/ 2.我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可:ht ...
- python 函数传递参数的多种方法
python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...
- 探寻main函数的“标准”写法,以及获取main函数的参数、返回值
main函数表示法 很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...
- jsp中四种传递参数的方法
jsp中四种传递参数的方法如下: 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="i ...
- Jsp传递参数的方法
今天老师讲了jsp中四种传递参数的方法,我觉得总结一下,挺好的,以备后用! 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超 ...
随机推荐
- html+css 知识整理
1.学网页最好的方法:学习别人的网页. 2.文档结构 <html>(超文本标记语言) <head> <title> </title> & ...
- PERL 学习
http://ju.outofmemory.cn/entry/193944 http://blog.sina.com.cn/s/blog_6a6c136d0101dlcw.html http://bl ...
- spring security源码分析之一springSecurityFilterChain
1. spring和spring security的集成,配置web.xml如下: <context-param> <param-name>contextConfigLocat ...
- C#.net 获取当前应用程序所在路径及环境变量
一.获取当前文件的路径 string str1=Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名. string st ...
- 【IT名人堂】何云飞:阿里云数据库的架构演进之路
[IT名人堂]何云飞:阿里云数据库的架构演进之路 原文转载自:IT168 如果说淘宝革了零售的命,那么DT革了企业IT消费的命.在阿里巴巴看来,DT时代,企业IT消费的模式变成了“云服务+数据”, ...
- 在C#中使用NPOI2.0操作Excel2003和Excel2007
Excel2003: #region Excel2003 /// <summary> /// 将Excel文件中的数据读出到DataTable中(xls) /// </summary ...
- ls与dir的区别
1.ls具有上色的效果,dir没有. 2.ls是unix/linux系列的命令,dir是dos/windows系列的命令.
- 解决ThinkPHP开启APP_DEBUG=>false时报错的问题
最近用ThinkPHP开发一个项目,本地开发测试完成上传到服务器后,第一次打开正常,再刷新页面时就出现 “页面调试错误,无法找开页面,请重试”的错误,我就郁闷啦,明明本地设置define('APP_D ...
- Oracle数据库查看执行计划
基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分 ...
- UISearchDisplayController隐藏navigationBar需注意
不能调用self.navigationController.navigationBar.hidden = YES: 调用此代码的话,你隐藏了navigationBar搜索展示控制器就拿不到导航条:就会 ...