main的參數(shù)
C語言規(guī)定main函數(shù)的參數(shù)只能有兩個剪芍,習慣上這兩個參數(shù)寫為argc和argv唉窃,argc(第一個形參)必須是整型變量,argv( 第二個形參)必須是指向字符串的指針數(shù)組。格式:
int main(int argc,char *argv[])
由于main函數(shù)不能被其它函數(shù)調用摩瞎, 因此不可能在程序內部取得實際值拴签。那么,在何處把實參值賦予main函數(shù)的形參呢?
實際上,main函數(shù)的參數(shù)值是從操作系統(tǒng)命令行上獲得的旗们。當我們要運行一個可執(zhí)行文件時蚓哩,在DOS提示符下鍵入文件名,再輸入實際參數(shù)即可把這些實參傳送到main的形參中去上渴。在DOS下一條完整的運行命令包含2部分:命令與相應的參數(shù)岸梨。格式為:
命令 參數(shù)1 參數(shù)2 ...
這種格式也叫命令行,命令行中的命令就是可執(zhí)行文件的文件名稠氮,它后面的參數(shù)要用空格分隔曹阔,是對命令的進一步補充,即是傳遞給main()函數(shù)的參數(shù)隔披。
其中整型argc表示命令行中字符串的個數(shù)赃份,argc的值是在輸入命令行時由系統(tǒng)按實際參數(shù)的個數(shù)自動賦予的。指針數(shù)組argv[]指向命令行中的各個字符串。這兩個參數(shù)可以用任何合法的標識符命名抓韩,但是習慣采用argc和argv纠永。
#include <stdio.h>
int main(int argc,char *argv[]){
int i=0;
printf("argc = %d\n",argc);
for(i = 0;i<argc;i++){
printf("argv[%d] = %s\n",i,argv[i]);
}
return 0;
}
編譯后在命令行中執(zhí)行:
template_arg.exe -a -b -c -d hello.txt
程序運行輸出:
argc = 6
argv[0] = template_arg.exe
argv[1] = -a
argv[2] = -b
argv[3] = -c
argv[4] = -d
argv[5] = hello.txt
可見,argc為6谒拴,argv[0]為自身運行目錄路徑和程序名尝江。
從argv[1]開始指向命令行中我們添加的參數(shù)。
這種形式帶來的問題就是選項開關和其他參數(shù)(如文件名)之間分類不清(都是字符串)英上,實現(xiàn)命令行參數(shù)位置的靈活和不出錯茂装,意味著在代碼中解析命令行參數(shù)時要充分考慮可能出現(xiàn)的情況。
有些C程序員采用了一種約定善延,帶'--'的參數(shù)少态,表示從這個參數(shù)開始,后面的參數(shù)都不是選項開關易遣,即便它是以連字符開頭彼妻。一種更好的解決辦法是把包袱扔給系統(tǒng)而不是用戶,使用參數(shù)處理器把參數(shù)分成選項開關和非選項開關兩種豆茫,目前這種簡單的argv機制由于使用的太廣侨歉,因而不可能對它做任何修改。
main的返回值
在 C99 標準中揩魂,main函數(shù)只有以下兩種定義方式是正確的:
int main( void )
int main( int argc, char *argv[])
void main()的用法是錯誤的幽邓。
main 函數(shù)的返回值類型必須是 int,返回值用于說明程序的退出狀態(tài)火脉。
如果返回0牵舵,則代表程序正常退出;返回其它數(shù)字的含義則由系統(tǒng)決定倦挂。
通常畸颅,返回非零代表程序異常退出。
如果 main 函數(shù)的最后沒有寫 return 語句的話方援,C99 規(guī)定編譯器要自動在生成的目標文件中(如 exe 文件)加入return 0没炒。
在 C89 中,main( ) 是可以接受的犯戏,也就是說 main()等同于int main()送火,不明確標明返回值的,默認返回值為int先匪。