???????
???? 在最近學習中老是遇到? int main(int argc,char* argv[]),以為就是簡單的參數應用了,但是看代碼是沒能理解參數的具體傳遞過程,上網找資料才算弄明白點,下面的一篇文章講的很好很詳細,大家可以根據自己的情況看看,資源充分利用嘛。(原文重復的地方已重新整理,無贅述)轉自http://blog.csdn.net/lambol_8309/article/details/4524964
int main(int argc,char* argv[])
argc是命令行總的參數個數?? ?? argv[]是argc個參數,其中第0個參數是程序的全名(包括文件絕對路徑),以后的參數命令行后面跟的用戶輸入的參數,比如:?? ?? int? main(int argc,? char* argv[])?? ?? {?? ?????? int?? i;?? ?????? for (i = 0; i<argc; i++)?? ??????????? cout<<argv[i]<<endl;?? ?????? cin>>i;?
?????? return?? 0;??
?? }?? ?? 執行時敲入?? ?? F:/MYDOCU~1/TEMPCODE/D1/DEBUG/D1.EXE?? aaaa?? bbb?? ccc?? ddd?? ?? 輸出如下:?? ?? F:/MYDOCU~1/TEMPCODE/D1/DEBUG/D1.EXE?? ?? aaaa?? ?? bbb?? ?? ccc?? ?? ddd?? -------------------------------------------------------------------- argc記錄了用戶在運行程序的命令行中輸入的參數的個數。?? arg[]指向的數組中至少有一個字符指針,即arg[0].他通常指向程序中的可執行文件的文件名。在有些版本的編譯器中還包括程序文件所在的路徑。 ------------------------------------------------------------------------- 在調用一個可執行程序時,某些情況下需要向程序傳遞參數。如我們可以在控制臺中鍵notepad.exe,回車后將執行記事本程序。如果我們希望在打開notepad時同時打開一個文本文件,可以在notepad.exe 后面跟上文件的路徑和名字,如notepad.exe example.txt(文件在當前路徑)。?? ???? 那么程序中如何能得到這些輸入參數呢?這個工作是編譯器幫我們完成的,編譯器將輸入參數的信息放入main函數的參數列表中。? main函數的參數列表保存了輸入參數的信息,第一個參數argc記錄了輸入參數的個數,第二個參數是字符串數組的,字符串數組的每個單元是char*類型的,指向一個c風格字符串。?? ?? 以notepad.exe?? example.txt為例?? ?? argc是2,就是說argv數組中有兩個有效單元?? ?? 第一單元指向的字符串是"notepad.exe"?? ?? 第二單元指向的字符串是"example.txt"?? ??? ?? argv數組中的第一個單元指向的字符串總是可執行程序的名字,以后的單元指向的字符串依次是程序調用時的參數。?? ??? ?? 這個賦值過程是編譯器完成的,我們只需要讀出數據就可以了。 ----------------------------------------------------------------------------- ? int?? argc?? ?? 這個東東用來表示你在命令行下輸入命令的時候,一共有多少個參數。比方說你的程序編譯后,可執行文件是test.exe?? ?? D:/tc2>test?? ?? 這個時候,argc的值是1?? ?? 但是?? ?? D:/tc2>test.exe?? myarg1?? myarg2? 的話,argc的值是3。也就是命令名加上兩個參數,一共三個參數?? ??? ?? char?? *argv[]?? ?? 這個東東用來取得你所輸入的參數?? ?? D:/tc2>test?? ?? 這個時候,argc的值是1,argv[0]的值是?? "test"?? ?? D:/tc2>test?? myarg1?? myarg2?? ?? 這個時候,argc的值是3,argc[0]的值是"test",argc[1]的值是"myarg1",argc[2]的值是"myarg2"。?? ?? 這個東東一般用來為程序提供非常重要的信息,如:數據文件名,等等。?? ?? 如:copy?? a.c?? b.txt?? ?? 這個時候,a.c和b.txt就是所謂的“非常重要的信息”。不指定這兩個文件,你沒法進行拷貝。?? ?? 當你的程序用到argc和argv這兩個參數的時候,可以簡單地通過判斷argc的值,來看看程序的參數是否符合要求?? ??? ?? char?? *envp[]?? ?? 這個東東相對來說用得比較少。它是用來取得系統的環境變量的。?? ?? 如:在DOS下,有一個PATH變量。當你在DOS提示符下輸入一個命令(當然,這個命令不是dir一類的內部命令)的時候,DOS會首先在當前目錄下找這個命令的執行文件。如果找不到,則到PATH定義的路徑下去找,找到則執行,找不到返回Bad?? command?? or?? file?? name?? ?? 在DOS命令提示符下鍵入set可查看系統的環境變量?? ?? 同樣,在UNIX或者LINUX下,也有系統環境變量,而且用得比DOS要多。如常用的$PATH,$USER,$HOME等等。?? ?? envp保存所有的環境變量。其格式為(UNIX下)?? ?? PATH=/usr/bin;/local/bin;?? ?? HOME=/home/shuui?? ?? 即:?? ?? 環境變量名=值?? ?? DOS下大概也一樣。?? ?? 環境變量一般用來為程序提供附加信息。如,你做了一個顯示文本的內容的程序。你想控制其一行中顯示的字符的個數。你可以自己定義一個環境變量(UNIX下)?? ?? %setenv?? NUMBER?? =?? 10?? ?? %echo?? $NUMBER?? ?? 10?? ?? 然后你可以在程序中讀入這個環境變量。然后根據其值決定一行輸出多少個字符。這樣,如果你不修改環境變量的話,你每次執行這個程序,一行中顯示的字符數都是不一樣的?? ?? 下面是一個例子程序?? ??? ?? /* argtest.c */?? ?? #include<stdio.h>?? ?? int main(?? int?? argc?? ,?? char?? *argv[]?? ,?? char?? *envp[]?? )?? ?? {?? ?? int?? i;?? ??? ?? printf(?? "You?? have?? inputed?? total?? %d?? argments/n"?? ,?? argc?? );?? ?? for(?? i=0?? ;?? i<argc?? ;?? i++)?? ?? {?? ?? printf(?? "arg%d?? :?? %s/n"?? ,?? i?? ,?? argv[i]?? );?? ?? }?? ??? ?? printf(?? "The?? follow?? is?? envp?? :/n"?? );?? ?? for(?? i=0?? ;?? *envp[i]!='/0'?? ;?? i++?? )?? ?? {?? ?? printf(?? "%s/n"?? ,?? envp[i]?? );?? ?? }?? ?? return?? 0;?? ?? }?? ??? ??? ?? D:/>argtest?? this?? is?? a?? test?? programe?? of?? main()'s?? argments?? ?? You?? have?? inputed?? total?? 9?? argments?? ?? arg0?? :?? D:/TC/NONAME.EXE?? ?? arg1?? :?? this?? ?? arg2?? :?? is?? ?? arg3?? :?? a?? ?? arg4?? :?? test?? ?? arg5?? :?? programe?? ?? arg6?? :?? of?? ?? arg7?? :?? main()'s?? ?? arg8?? :?? argments?? ?? The?? follow?? is?? envp?? :?? ?? TMP=C:/WINDOWS/TEMP?? ?? TEMP=C:/WINDOWS/TEMP?? ?? PROMPT=$p$g?? ?? winbootdir=C:/WINDOWS?? ?? PATH=C:/WINDOWS;C:/WINDOWS/COMMAND?? ?? COMSPEC=C:/WINDOWS/COMMAND.COM?? ?? SBPCI=C:/SBPCI?? ?? windir=C:/WINDOWS?? ?? BLASTER=A220?? I7?? D1?? H7?? P330?? T6?? ?? CMDLINE=noname?? this?? is?? a?? test?? programe?? of?? main()'s?? argments???? ----------------------------------------------------------------------------------------- 命令行參數啊。argc?? 是參數的個數,argv[]是參數,argv[0]是文件名,argv[1]是第一個參數...?? ?? 如你得exe文件名是:myprog.exe,那么?? ?? myprog?? 12?? 22?? 32?? ?? 則argv[0]="myprog",argv[1]="12",argv[2]="22"...?? ??? ?? exit()是程序退出時的返回碼。可以用其他程序接收,判斷是否正常退出。如exit(-1)認為異常退出。