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 的基本用法,并配合健壮的参数校验与错误提示,能显著提升程序的可用性与稳定性。