1、argc
和 argv
的基本概念
C 语言中的 main
函数可以接受两个参数int main(int argc, char *argv[])
,其中,argc
(argument count)表示传递给程序的参数个数(包含程序本身的名称)。argv
(argument vector)是一个 char*
数组,每个元素都是一个字符串,存储命令行输入的参数。
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("参数个数: %d\n", argc);
for (int i = 0; i < argc; i++) {
printf("argv[%d]: %s\n", i, argv[i]);
}
return 0;
}
2、解析整数和浮点数参数
如果参数是数字,需要使用 atoi
、atof
或 strtol
进行转换。
#include <stdio.h>
#include <stdlib.h> // 包含 atoi、atof
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("用法: %s <整数> <浮点数>\n", argv[0]);
return 1;
}
int num = atoi(argv[1]); // 将字符串转换为整数
double value = atof(argv[2]); // 将字符串转换为浮点数
printf("整数: %d\n", num);
printf("浮点数: %lf\n", value);
return 0;
}
3、解析带选项的命令行参数
如果命令行包含选项(flags),可以使用 strcmp()
解析选项。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int num = 0;
char *str = NULL;
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "-n") == 0 && i + 1 < argc) {
num = atoi(argv[i + 1]);
i++; // 跳过下一个参数
} else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) {
str = argv[i + 1];
i++; // 跳过下一个参数
}
}
printf("数字: %d\n", num);
printf("字符串: %s\n", str ? str : "未提供");
return 0;
}
4、使用 getopt()
解析选项
getopt()
是 POSIX 标准的选项解析函数,适用于复杂命令行参数。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // 包含 getopt
int main(int argc, char *argv[]) {
int num = 0;
char *str = NULL;
int opt;
while ((opt = getopt(argc, argv, "n:s:")) != -1) {
switch (opt) {
case 'n':
num = atoi(optarg);
break;
case 's':
str = optarg;
break;
default:
fprintf(stderr, "用法: %s -n <数字> -s <字符串>\n", argv[0]);
exit(EXIT_FAILURE);
}
}
printf("数字: %d\n", num);
printf("字符串: %s\n", str ? str : "未提供");
return 0;
}
5、解析长选项(GNU getopt_long
)
getopt()
仅支持短选项(如 -n
),如果要支持 --name
这种长选项,可以使用 getopt_long()
(GNU 扩展)。
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
int main(int argc, char *argv[]) {
int num = 0;
char *str = NULL;
struct option long_options[] = {
{"num", required_argument, NULL, 'n'},
{"str", required_argument, NULL, 's'},
{0, 0, 0, 0}
};
int opt;
while ((opt = getopt_long(argc, argv, "n:s:", long_options, NULL)) != -1) {
switch (opt) {
case 'n':
num = atoi(optarg);
break;
case 's':
str = optarg;
break;
default:
fprintf(stderr, "用法: %s --num <数字> --str <字符串>\n", argv[0]);
exit(EXIT_FAILURE);
}
}
printf("数字: %d\n", num);
printf("字符串: %s\n", str ? str : "未提供");
return 0;
}