Linux中 C++ main函数参数argc和argv含义及用法

Linux中 C++ main函数参数argc和argv含义及用法

简介

argc 是 argument count的缩写,表示传入main函数的参数个数;

argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说需要我们输入的main函数的参数个数应该是argc-1个;

实验

直接运行

#include <iostream>
 
using namespace std;

int main(int argc, char** argv){
	for (int i=0; i<argc; ++i){
		cout << "argument[" << i << "] is : " << argv[i] << endl;
	}
	return 0;
}

注意:argv是指向指针的指针,main函数的第二个参数char \*argv[]也可以替换为 char **argv,两者是等价的。

下面我们在Linux命令行编译运行该程序:

g++ -c test.cpp -o test.o
g++ test.o -o test
./test

输出:

argument[0] is : ./test

可以看到,直接运行的话输出的argv只有一个参数,即本文件的路径

传入参数

既然有argc作为argv的计数,那么设计时的考量就肯定不可能是只有一个参数。那么怎样想main函数传入参数呢?

在Windows下,可以通过在集成开发环境IDE(如VS2019)中设置命令参数。

而在Linux下,我们则可以直接通过在命令行运行文件时传入命令参数。

同样时上面的程序,如果我们这样运行:

./test hello world !

注意中间用空格分隔,则会得到输出:

argument[0] is : ./test
argument[1] is : hello
argument[2] is : world
argument[3] is : !

可以看到,三个字符串helloworld!分别作为argv的第1,2,3个参数传入了main函数。

这样我们就可以很方便地在程序运行时,通过命令行向程序传递参数。这是十分有用的,比如用opencv打开指定的图片,存储指定的文件等,只要是在写源代码时不确定,需要根据运行时的具体输入作为参数的程序,均可使用argv参数。

例程

例1

例如,我们写一个函数,将最后一个argv参数作为文件名,将前面的参数作为文本内容,写到该文件中:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char** argv){
	string fileName = argv[argc-1];
	ofstream outfile(fileName, ios::trunc);

	for (int i=1; i<argc-1; ++i){
		outfile << argv[i] << ' ';
	}
	outfile << endl;
	
	outfile.close();
	return 0;
}

编译运行:

g++ -c writeArgv.cpp -o  writeArgv.o
g++ writeArgv.o -o writeArgv
./writeArgv Hello main, I am writing argc and argv. writeArgv.txt

成功在writeArgv.txt中写入:Hello main, I am writing argc and argv.

例2

argv命令行传参的方式传入opencv要打开的图像文件:

#include <iostream>
#include <core/core.hpp>
#include <highgui/highgui.hpp>
using namespace std;
using namespace cv;
 
void main(int argc,char **argv){
	Mat image=imread(argv[1]);
	imshow("Lena",image);
	waitKey();
}

注意

  1. 可以有argcargv,但是在函数体中没有用,这一点和其他函数也是类似的。

  2. 有时还有第三个参数,char** env,为字符串数组。env的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。平时使用到的比较少,一般只用前两个参数argcargv

  3. 另外要提醒的是,变量名argcargv与其他常规C++变量名一样,只要合理且符合规范即可,不一定非要叫argc, argv,如:

    int main(int count, char** params){
    	// write your code
    }
    

    都是可以的。

Ref:

https://blog.csdn.net/dcrmg/article/details/51987413

https://blog.csdn.net/dgreh/article/details/80985928

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值