天天看點

關于int main( int argc, char* argv[] ) 中arg和argv參數的解析及調試

        在示例程式中經常可以看到argc和argv這兩個參數 ,在調試代碼過程中遇到main函數為int main( int argc, char* argv[] ) 這種類型時往往會報錯,或者是運作起來了但指令視窗一閃而過,沒有出來結果。網上關于這方面的資料也有點亂,在看淺墨大大一書發現其中有關于這一方面的講解甚為詳細,抑制不住要與大家分享的沖動,現結合網上内容并予以實驗,整理如下:

        帶形參的main函數,如 main( int argc, char* argv[], char **env ) ,是UNIX、Linux以及Mac OS作業系統中C/C++的main函數标準寫法,并且是血統最純正的main函數寫法。

        在如今的Visual Studio編譯器中,main()函數帶有參數argc和argv或者不帶,即無論是否在函數體中使用argc和argv,傳回值為void或不為void,都是合法的。

        即至少有如下三種寫法合法:

1、傳回值為整型帶參的main函數

int main( int argc, char** argv )
{ 
     //函數體内使用或不使用argc和argv都可
     ……
     return ;
}
           

2、傳回值為整型不帶參的main函數

int main( int argc, char** argv )
{ 
     //函數體内使用了argc或argv
     ……
     return ;
}
           

3、傳回值為void且不帶參的main函數

void main()
{ 
     ……
}
           

一、argc、argv的具體含義

        argc和argv參數在用指令行編譯程式時有用。main( int argc, char* argv[], char **env ) 中

        第一個參數,int型的argc,為整型,用來統計程式運作時發送給main函數的指令行參數的個數,在VS中預設值為1。

        第二個參數,char*型的argv[],為字元串數組,用來存放指向的字元串參數的指針數組,每一個元素指向一個參數。各成員含義如下:

        argv[0]指向程式運作的全路徑名

        argv[1]指向在DOS指令行中執行程式名後的第一個字元串

        argv[2]指向執行程式名後的第二個字元串

        argv[3]指向執行程式名後的第三個字元串

        argv[argc]為NULL

        第三個參數,char**型的env,為字元串數組。env[]的每一個元素都包含ENVVAR=value形式的字元串,其中ENVVAR為環境變量,value為其對應的值。平時使用到的比較少。

二、調試方法

方法一:

        下面給出一個很典型的例子來進行示範說明:

#include <stdio.h>
using namespace std;

int main(int argc, char ** argv)
{
    int i;
    for (i = ; i < argc; i++)
        printf("Argument %d is %s\n", i, argv[i]);
    return ;
}
           

        調試後,找到exe檔案所在的位置D:\Program Files\OpenCV\opencv\opencv_test\argc argv_test\Debug裡,具體位置因人而異。

關于int main( int argc, char* argv[] ) 中arg和argv參數的解析及調試

        參考http://blog.csdn.net/lyj_viviani/article/details/51817755這裡的指令行使用方法,在exe檔案夾中shift+右擊,選擇“在此處打開指令視窗”,按TAB鍵切換檔案,選擇exe檔案,輸入 a b c d回車(注意在a b c d前面要加個空格),得到如下結果:

關于int main( int argc, char* argv[] ) 中arg和argv參數的解析及調試

方法二

        調試如下代碼:

#include <stdio.h>
using namespace std;

int main(int argc, char ** argv)
{
    int i;
    for (i = ; i < argc; i++)
        printf("Argument %d is %s\n", i, argv[i]);
    getchar();//等待讀入任意字元而結束,在此用于保持視窗顯示,按下Enter鍵即可退出
    return ;
}
           

        進入項目【項目】—>【屬性】—>【調試】—>【指令參數】—>輸入a b c d,如果有多個字元串參數,則用空格隔開。比如要讀入兩張圖檔,在指令參數裡輸入”1.jpg” “2.jpg”。

關于int main( int argc, char* argv[] ) 中arg和argv參數的解析及調試
關于int main( int argc, char* argv[] ) 中arg和argv參數的解析及調試
關于int main( int argc, char* argv[] ) 中arg和argv參數的解析及調試

方法三:

        最簡單的方法就是在不變動原始程式的基礎上,将與argc或argv有關的代碼注釋或替換掉。比如将“Mat Image=imread(argv[1]);”替換成“Mat Image=imread(“1.jpg”);”。

繼續閱讀