功能可自动提取文本核心内容,生成30-80字的精炼概述,帮助用户快速掌握关键信息,适用于报告、论文或新闻的要点速览。
核心机制:main()函数的参数
C程序的入口函数main()
有两种标准形式:
int main(int argc, char *argv[]); // 带参数版本 int main(void); // 无参数版本
- argc(参数计数):整数类型,表示命令行参数的数量(包括程序名本身)。
- argv(参数向量):字符指针数组,每个元素指向一个命令行参数的字符串。
例如执行:
./myapp -f input.txt
则参数解析为:
argc = 3
(程序名./myapp
、-f
、input.txt
)argv[0] = "./myapp"
argv[1] = "-f"
argv[2] = "input.txt"
argv[3] = NULL
(数组以空指针结尾)
实战代码示例
场景:计算两个数的和
int main(int argc, char *argv[]) {
// 校验参数数量(程序名 + 两个数字 = 3个参数)
if (argc != 3) {
printf("用法: %s <数字1> <数字2>\n", argv[0]);
return 1; // 非零返回值表示错误
}
// 将字符串参数转为整数
int num1 = atoi(argv[1]);
int num2 = atoi(argv[2]);
printf("结果: %d\n", num1 + num2);
return 0; // 返回0表示成功
}
编译后运行:
./calculator 5 8 结果: 13
高级应用场景
-
文件处理工具
通过参数指定输入/输出文件:./encrypt -i secret.txt -o encrypted.dat
for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-i") == 0) input_file = argv[++i]; // 获取下一个参数 else if (strcmp(argv[i], "-o") == 0) output_file = argv[++i]; }
-
配置程序行为
使用标志参数控制功能:./simulator --verbose --speed=5
for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "--verbose") == 0) enable_logging = 1; else if (strstr(argv[i], "--speed=") == argv[i]) speed = atoi(argv[i] + 8); // 跳过"--speed=" }
关键注意事项
-
参数边界检查
始终验证argc
值,避免访问argv[argc]
(越界导致崩溃):if (i + 1 >= argc) { // 确保下一个参数存在 fprintf(stderr, "选项 %s 需要参数\n", argv[i]); exit(EXIT_FAILURE); }
-
类型安全转换
使用strtol()
替代atoi()
,可检测转换错误:char *endptr; long num = strtol(argv[1], &endptr, 10); if (*endptr != '\0') { // 检查非数字字符 fprintf(stderr, "无效数字: %s\n", argv[1]); exit(EXIT_FAILURE); }
-
跨平台差异
- Windows系统参数不区分大小写,Unix-like系统区分大小写
- 带空格的参数需用引号包裹:
./app "file name.txt"
为什么需要命令行参数?
- 自动化脚本:无需人工交互即可批量执行任务
- 灵活配置:动态调整程序行为(如调试模式、文件路径)
- 管道操作:与其他命令行工具协同工作(如
grep
、sort
)
引用说明: 参考ISO/IEC 9899:2018(C17标准)中关于main()
函数的规范,以及《C程序设计语言(K&R)》第5.10节“命令行参数”,代码示例遵循ANSI C标准,兼容GCC、Clang、MSVC等主流编译器。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/7591.html