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 : !
可以看到,三個字符串hello
,world
,!
分別作為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();
}
注意
-
可以有
argc
和argv
,但是在函數體中沒有用,這一點和其他函數也是類似的。 -
有時還有第三個參數,
char** env
,為字符串數組。env
的每一個元素都包含ENVVAR=value
形式的字符串,其中ENVVAR
為環境變量,value
為其對應的值。平時使用到的比較少,一般只用前兩個參數argc
、argv
。 -
另外要提醒的是,變量名
argc
和argv
與其他常規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