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