首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言 main 函數完整指南:參數接收、命令列解析、跨平台差異

     編輯:關於C語言

main 函數標準簽名

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 定義)。

參數詳解

  • argc (argument count):參數總數。**至少為 1**。`argv[0]` 為程式名稱/路徑。
  • argv (argument vector):字串指標陣列。`argv[argc] == NULL` (標準保證)。

實戰範例

1. 獲取程式名稱與參數個數


#include 
int main(int argc, char *argv[]) {
    printf("參數個數 argc = %d\n", argc); // 直接執行輸出 1
    printf("程式名稱 argv[0] = %s\n", argv[0]);
    return 0;
}

2. 遍歷所有參數


#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`

3. 參數類型轉換 (字串 → 數值)

`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;
}

IDE 中設定命令列參數

  • Visual Studio:專案屬性 → 偵錯 → 命令引數。
  • Code::Blocks / Dev-C++:專案 → 設定引數 / 執行參數。
  • C++Builder:Run → Parameters / Project Options → Debugger。
  • CLion / VS Code:`launch.json` / `CMakeLists.txt` 設定 `args`。

Windows 獨特機制:`_tmain` 與 `TCHAR`

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;
}

總結

  1. 永遠聲明 `int main(...)` 並 `return` 整數。
  2. 善用 `argc/argv` 實現命令列工具特性。
  3. 參數轉換優先用 `strtol/strtod` 而非 `atoi/atof`(安全性)。
  4. 跨平台避免 `_tmain`/`TCHAR`,統一 UTF-8 處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved