C/C++ 中 main(int argc, char* argv[], char** env) 函式的引數及應用
main 中引數介紹
通常在我們使用 main( ) 函式時,格式如下:
int main(){
...
return 0;
}
main( ) 函式中括號內是不需要傳遞引數的,然而有些時候我們卻會碰到帶了多個引數的main:
int main(int argc, char* argv[], char** env)
這些引數究竟是什么意思呢?
第一個引數int argv代表命令列引數個數,argv值至少為1,更確切地說是代表第二個引數char* argv[]中元素的個數,從型別上說,argv[]是指標陣列,陣列中的元素是指標,指標指向字串引數;從作用而言,argv[]是命令列輸入的引數串列,記錄了程式員在命令列中輸入的所有引數,其中第1個引數是所寫程式對應的可執行檔案 (.exe) 的完整檔案路徑,其后的引數為用戶在命令列中輸入的其他字串,
int main(int argc, char* argv[])
{
for(int i = 0; i < argc; i++)
printf("argv[%d]: %s\n", i, argv[i]);
return 0;
}
若在CodeBlocks中直接運行 main.cpp,則僅輸出一個默認引數 argv[0],也就是程式對應的可執行檔案 (.exe) 的檔案路徑,

有興趣的同學可以 win + R ,輸入 cmd ,進入命令列視窗,將檔案路徑輸入,空格,再隨意輸入一些其他字符 ( 如下圖 ),最后回車,看看輸出結果是什么,

第三個引數char **env指向了當前的環境變數,例如可用以下代碼查看本機的環境變數
int main(int argc, char*argv[], char**env)
{
for(int i = 0; env[i]; i++){
printf("env[%d]: %s\n",i ,env[i]);
}
printf("Finished!\n");
return 0;
}
部分環境變數結果如下

main 函式引數的應用案例
我們可以看到 env[39] 中環境變數為 “ USERNAME=XXX ” ,含義為當前的用戶名為 XXX ,既然我們能夠從環境變數中提取到當前用戶名資訊,那么我們可以設計一個函式使得只有當前用戶名是指定用戶名 ( 如:YeJY ) 時,才能執行某一操作 ( 如:printf("Right! Execute the program\n") ) ,否則退出程式,輸出 “Error”,不執行任何操作,這樣我們就實作了一個簡單的權限控制,
int main(int argc, char*argv[], char**env)
{
//for(int i = 0; i < argc; i++) printf("argv[%d]: %s\n", i, argv[i]);
for(int i = 0; env[i]; i++){
printf("env[%d]: %s\n",i ,env[i]);
string s = env[i];
if(s.find("USERNAME=") == 0){
string c = s.substr(9, s.size()); //“USERNAME=” 長度為 9,“=” 后下個字符下標為 9;
if(c == "YeJY") printf("Right! Execute the program\n");
else {
printf("Error\n");
exit(1);
}
}
}
printf("Finished!\n");
return 0;
}
程式執行結果如下

如此一來,當且僅當用戶名為 “YeJY” 時,程式中某些指令才會正常執行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265864.html
標籤:其他
