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.超 ...
随机推荐
- 【Oracle】ORA-00600: [kfgFinalize_2]
环境: OS:OEL5.6 RAC:10.2.0.1.0 [root@rac2 ~]# crs_stat -t Name Type Target Stat ...
- MySQL Order By实现原理分析和Filesort优化
http://blog.csdn.net/hguisu/article/category/796963
- 在Shell中使用函数文件
需要编写一个较庞大的脚本时,可能会涉及许多函数.变量.这是通常建议将众多的函数.变量放入一个单独的脚本内.这样做的好处很明显,不用担心某个函数.变量是否已经被定义和使用,也不用频繁地定义.清除函数和变 ...
- PHP经验——PHPDoc PHP注释的标准文档(翻译自Wiki)
文档注释,无非“//”和“/**/”两种 ,自己写代码,就那么点,适当写几句就好了:但是一个人总有融入团队的一天,团队的交流不是那几句注释和一张嘴能解决的,还需要通用的注释标准. PHPDoc是PHP ...
- Working with MTD Devices
转:http://www.linuxforu.com/2012/01/working-with-mtd-devices/ Working with MTD Devices By Mohan Lal J ...
- 在window平台搭建Qt开发环境(使用VS2008 IDE)
一直用QT Creator(mingw)开发Qt应用程序,每次如果需要修改编译链接参数选项时,都要修改pro文件,而这个文件是基于文本的,每次都要记住这些选项参数名,如果在知道原理的情况下还记住这些字 ...
- 让Laravel5支持memcache的方法
Laravel5框架在Cache和Session中不支持Memcache,看清了是Memcache而不是Memcached哦,MemCached是支持的但是这个扩展真的是装的蛋疼,只有修改部分源码让其 ...
- WPF 之 style文件的引用
总结一下WPF中Style样式的引用方法. 一.内联样式: 直接设置控件的Height.Width.Foreground.HorizontalAlignment.VerticalAlignment等属 ...
- .net 4.0 运行时中运行.net2.0开发的程序
其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了一个问题,就是现有的Sy ...
- 【转】ViewGroup的onMeasure和onLayout分析
ViewGroup的onMeasure和onLayout分析 一个Viewgroup基本的继承类格式如下: 1 import android.content.Context; 2 import and ...