C++ main函式命令列引數使用

weixin_34162629發表於2017-04-25

 

1. C/C++語言中的main函式,經常帶有引數argc,argv,如下:

int main(int argc, char** argv)
int main(int argc, char* argv[])

C語言還規定argc(第一個形參)必須是整型變數,argv( 第二個形參)必須是指向字串的指標陣列。加上形參說明後,main函式的函式頭應寫為:

 main (int argc,char *argv[])

 

2. 由於main函式不能被其它函式呼叫,因此不可能在程式內部取得實際值。那麼,在何處把實參值賦予main函式的形參呢? 實際上,main函式的引數值是從作業系統命令列上獲得的。

   如何在作業系統命令列獲取引數呢?

    (1)在VS中設定時右鍵專案->屬性->除錯->命令引數,在命令引數中新增所需引數,字串之間用空格分開即可。如果是.txt檔案,要放在當前目錄下(.cpp所在目錄),不然找不到。

    (2)或者:假如你的程式是hello.exe,如果在命令列執行該程式,(首先應該在命令列下用 cd 命令進入到 hello.exe 檔案所在目錄) 執行命令為:

  1. hello.exe data.txt //.txt也在.exe所在目錄下

   但是應該特別注意的是,main 的兩個形參和命令列中的引數在位置上不是 一 一 對應的。

   因為,main的形參只有二個,而命令列中的引數個數原則上未加限制。argc參數列示了命令列中引數的個數(注意:檔名本身也算一個引數),argc的值是在輸入命令列時由系統按實際引數的個數自動賦予的。

 

3. 舉例:

在呼叫一個可執行程式時,某些情況下需要向程式傳遞引數。如我們可以在控制檯中鍵入notepad.exe,
回車後將執行記事本程式。如果我們希望在開啟notepad時同時開啟一個文字檔案,可以在notepad.exe  
後面跟上檔案的路徑和名字,如notepad.exe   example.txt(檔案在當前路徑)。  
    
   那麼程式中如何能得到這些輸入引數呢?這個工作是編譯器幫我們完成的,編譯器將輸入引數的資訊
放入main函式的引數列表中。  
    
   main函式的引數列表儲存了輸入引數的資訊,第一個引數argc記錄了輸入引數的個數,  
   第二個引數是字串陣列的,字串陣列的每個單元是char*型別的,指向一個c風格字串。  
   以notepad.exe   example.txt   data.txt   train.txt 為例  
   argc是4,就是說argv陣列中有四個有效單元  
   第一單元指向的字串是"notepad.exe"  
   第二單元指向的字串是"example.txt"  
   第三單元指向的字串是"data.txt"  
   第四單元指向的字串是"train.txt"  


   argv陣列中的第一個單元指向的字串總是可執行程式的名字,以後的單元指向的字串依次是程式呼叫時的引數。  
    
   這個賦值過程是編譯器完成的,我們只需要讀出資料就可以了。

#include <iostream>
using namespace std;


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

 

在命令列引數中輸入data.txt

結果如下:

 

 

相關文章