Skip to content

C 命令行参数(Command-line Arguments)

C 程序入口通常为:

c
int main(int argc, char *argv[]);
  • argc:参数个数(包含程序名)。
  • argv:参数字符串数组,argv[0] 通常是程序名。

1. 基本遍历

c
#include <stdio.h>
int main(int argc, char *argv[]) {
    for (int i = 0; i < argc; ++i) {
        printf("arg[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

2. 将字符串转为数值

使用 strtol/strtoul/strtod 等并检查错误:

c
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

long parse_long(const char *s, int *ok) {
    errno = 0; char *end = NULL;
    long v = strtol(s, &end, 10);
    if (errno || end==s || *end!='\0') { if (ok) *ok = 0; return 0; }
    if (ok) *ok = 1; return v;
}

3. 选项解析思路

  • 简单程序:手动遍历 argv,识别 -o--flag 等。
  • 复杂程序:可使用现有解析库(按平台选择)。

4. 使用示例:复制文件

c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <src> <dst>\n", argv[0]);
        return 1;
    }
    FILE *in = fopen(argv[1], "rb");
    if (!in) { perror("open src"); return 2; }
    FILE *out = fopen(argv[2], "wb");
    if (!out) { perror("open dst"); fclose(in); return 3; }
    char buf[4096]; size_t n;
    while ((n = fread(buf, 1, sizeof buf, in)) > 0) {
        if (fwrite(buf, 1, n, out) != n) { perror("write"); break; }
    }
    fclose(out); fclose(in);
    return 0;
}

5. 小结

理解 argc/argv 的基本用法,并配合健壮的参数校验与错误提示,能显著提升程序的可用性与稳定性。

本站内容仅供学习和研究使用。