C 標準 (C99/C11) 定義兩種標準簽名:
// 1. 無參數
int main(void) { /* ... */ return 0; }
// 2. 帶命令列參數
int main(int argc, char *argv[]) { /* ... */ return 0; }
// 等價寫法:int main(int argc, char **argv)
返回值:`0` 或 `EXIT_SUCCESS` 表示成功;非零表示失敗碼(具體含義依作業系統/Shell 定義)。
#include
int main(int argc, char *argv[]) {
printf("參數個數 argc = %d\n", argc); // 直接執行輸出 1
printf("程式名稱 argv[0] = %s\n", argv[0]);
return 0;
}
#include
int main(int argc, char *argv[]) {
printf("正序遍歷:\n");
for (int i = 1; i < argc; i++) { // 從 1 開始跳過程式名
printf(" argv[%d] = %s\n", i, argv[i]);
}
printf("\n逆序遍歷:\n");
while (--argc > 0) { // argc 遞減至 1
printf(" argv[%d] = %s\n", argc, argv[argc]);
}
return 0;
}
執行:`./demo 11 22 33`
`argv` 均為字串,需轉換:
#include
#include // atoi, atol, atof, strtol, strtod
int main(int argc, char *argv[]) {
if (argc < 2) { fprintf(stderr, "用法: %s <數字>\n", argv[0]); return 1; }
int i = atoi(argv[1]); // 簡易,無錯誤檢查
long l = atol(argv[1]);
double d = atof(argv[1]);
// 推薦:strto* 系列,可檢測錯誤與進制
char *endptr;
long val = strtol(argv[1], &endptr, 10); // 10 進制
if (*endptr != '\0') fprintf(stderr, "非數字字元: %s\n", endptr);
printf("int:%d long:%ld double:%g strtol:%ld\n", i, l, d, val);
return 0;
}
Windows 支援 Unicode (UTF-16) 與 ANSI (多位元組) 兩套 API。
// 標準 main (ANSI/UTF-8 命令列)
int main(int argc, char *argv[]);
// Windows TCHAR 通用映射 (需 #include )
int _tmain(int argc, _TCHAR *argv[]);
// 預處理展開 (視專案字元集設定):
// MBCS (多位元組): _tmain -> main, _TCHAR -> char
// Unicode (UTF-16): _tmain -> wmain, _TCHAR -> wchar_t
建議:現代跨平台專案**直接使用標準 `main(int argc, char *argv[])`**,內部統一用 UTF-8。Windows 進入點可編寫薄包裝層將 `wmain` (UTF-16) 轉為 UTF-8 再調用核心邏輯。
標準 C 無直接獲取環境變數函數(屬 POSIX `getenv` / Windows `GetEnvironmentVariable`)。`main` 第三參數 `char *envp[]` 為常見擴展(非標準):
// GCC/Clang/Linux 常見擴展
int main(int argc, char *argv[], char *envp[]) {
for (int i = 0; envp[i]; i++) printf("%s\n", envp[i]);
return 0;
}