C 程式以函數組裝,main() 為程式進入點(主調函數)。一般函數分有參/無參,由 main 或其他函數調用並傳參。但 main 無法被其他函數調用,其參數只能由作業系統啟動時傳遞。
main(int argc, char *argv[])
或
main(int argc, char **argv)
argc (argument count):整數,記錄命令列命令 + 參數總個數argv (argument vector):指標陣列,argv[0] ~ argv[argc-1] 分別指向各字串命令列格式:命令 參數1 參數2 ... 參數n
空格分隔,命令即可執行檔檔名(如 program.exe)。
// 命令列:
program str1 str2 str3 str4 str5
// main 參數:
argc = 6 (program + 5 參數)
argv[0] = "program" // 命令本身
argv[1] = "str1"
argv[2] = "str2"
argv[3] = "str3"
argv[4] = "str4"
argv[5] = "str5"
關鍵:argv[0]永遠是命令/程式名,實際參數從argv[1]開始。
利用繪圖庫繪製變化圓環,參數從命令列輸入:基礎圓半徑 R1、小圓半徑 Rs、背景色。
#include
#include
#include // atoi()
#define PI 3.1415926
main(int argc, char *argv[]) {
int x, y, r1, rs, color;
double a;
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "..\\bgi"); // 啟動繪圖模式
// 從命令列取得參數(argv 為字串,需轉整數)
r1 = atoi(argv[1]); // 基礎圓半徑
rs = atoi(argv[2]); // 同心圓半徑
color = atoi(argv[3]); // 背景色
cleardevice(); // 清除繪圖螢幕
setbkcolor(color); // 設定背景色
setcolor(4); // 設定繪圖顏色(紅)
// 繪製 n 個同心圓(基礎圓周等分點為圓心)
for (a = 0; a <= 2 * PI; a += PI / 18) {
x = r1 * cos(a) + 320; // 螢幕中心 (320,240)
y = r1 * sin(a) + 240;
circle(x, y, rs); // 以 (x,y) 為圓心,半徑 rs 畫圓
}
getch(); // 等待按鍵
closegraph(); // 關閉繪圖模式
}
// 編譯連結生成 L6-29.exe
// 命令列執行:
L6-29 40 20 3
// 對應:
argv[0] = "L6-29"
argv[1] = "40" → r1 = 40
argv[2] = "20" → rs = 20
argv[3] = "3" → color = 3
argv 元素為字串指標,數值參數需轉換:
atoi(s):字串 → intatol(s):字串 → longatof(s):字串 → double需 #include 。
if (argc < 4) {
printf("Usage: %s \n", argv[0]);
exit(1);
}
防止缺參數導致存取越界崩潰。
argv 為指標陣列,每元素指向命令列對應字串strcpy 複製到自有緩衝區標準庫 unistd.h 提供 getopt() 處理 -x value 風格選項,支援:
-a -b value--all --buffer=size(GNU 擴展)
int main(int argc, char *argv[]) {
...
return 0; // 成功結束
}
return 0 / exit(0):正常結束return 非零 / exit(非零):異常結束,供腳本/父程序判斷main 無 return,C99 保證隱性 return 0
main(int argc, char *argv[], char *envp[]) // 非標準但廣泛支援
envp 指向環境變數字串陣列(NAME=VALUE 格式),以 NULL 結尾。標準做法用 getenv() 存取。
main 可帶參數 argc、argv,由 OS 啟動時傳遞argc = 命令列總項目數(含命令),argv[i] 指向第 i 項字串argv[0] 為程式名,實際參數從 argv[1] 起atoi/atol/atof 轉數值argc 防越界,提供 Usage 提示