当前位置: 首页 > article >正文

Linux C编程基础知识(命令行参数)

getopt接口int getopt(int argc, char *const argv[], const char *optstring);参数说明参数作用argc/argv直接传入 main 函数的命令行参数个数 数组optstring选项规则字符串核心规则- 单个字符如 h→ 无参数选项-h- 字符 :如 p:→ 必须带参数的选项-p 8080- 字符 ::GNU 扩展→ 可选参数的选项-p8080不能有空格。关键全局变量getopt 内置变量作用optarg指向当前选项的参数值如 -p 8080optarg 8080optind下一个待解析的 argv索引解析完选项后可通过它获取非选项参数opterr非 0 时getopt 自动输出错误提示如未知选项设为 0 可关闭自定义错误optopt存储无法识别的选项字符用于自定义错误提示。示例#include stdio.h #include unistd.h // getopt #include stdlib.h // atoi #include errno.h // errno #include limits.h // INT_MAX/INT_MIN #define VERSION v1.0.0 // 打印帮助信息 void print_help(const char *prog_name) { printf(用法%s [选项] [非选项参数]\n, prog_name); printf(选项\n); printf( -h 显示帮助信息\n); printf( -p 端口 指定服务端口1-65535必填\n); printf( -v 输出版本信息\n); } int main(int argc, char *argv[]) { int port 0; int opt; // 关闭getopt默认错误提示自定义更友好的错误 opterr 0; // 循环解析选项optstring hp:vh无参p有参v无参 while ((opt getopt(argc, argv, hp:v)) ! -1) { switch (opt) { case h: // 帮助 print_help(argv[0]); return 0; case p: // 端口带参数 // 安全转换端口替代atoi检测非法输入 errno 0; long temp strtol(optarg, NULL, 10); if (errno ! 0 || temp 1 || temp 65535 || temp INT_MAX) { fprintf(stderr, 错误端口必须是1-65535的整数输入%s\n, optarg); return 1; } port (int)temp; break; case v: // 版本 printf(版本%s\n, VERSION); return 0; case ?: // 未知选项/缺少参数 if (optopt p) { fprintf(stderr, 错误选项 -%c 需要传入端口参数\n, optopt); } else { fprintf(stderr, 错误未知选项 -%c\n, optopt); } fprintf(stderr, 使用 %s -h 查看帮助\n, argv[0]); return 1; default: return 1; } } // 检查必填参数 if (port 0) { fprintf(stderr, 错误必须通过 -p 指定端口\n); fprintf(stderr, 使用 %s -h 查看帮助\n, argv[0]); return 1; } // 解析非选项参数optind 指向第一个非选项参数 if (optind argc) { printf(\n非选项参数\n); for (int i optind; i argc; i) { printf( %s\n, argv[i]); } } // 业务逻辑 printf(\n程序启动端口 %d\n, port); return 0; }getopt_long接口int getopt_long(int argc, char *const argv[],const char *optstring,const struct option *longopts,int *longindex);参数说明参数作用argc/argv直接传入 main 函数的命令行参数个数 数组optstring短选项规则字符串和 getopt 完全一致如 hp:vlongopts长选项规则结构体数组核心定义每个长选项的名称、参数要求等longindex输出参数存储当前解析到的长选项在 longopts 中的索引传 NULL 则忽略长选项核心结构体struct option这是 getopt_long 的关键每个元素对应一个长选项struct option { const char *name; // 长选项名如 help、port int has_arg; // 参数要求 // no_argument (0) → 无参数如 --help // required_argument (1) → 必须带参数如 --port // optional_argument (2) → 可选参数如 --logdebug int *flag; // 标志位 // NULL → getopt_long 返回 val 的值 // 非NULL → 将 val 赋值给 *flag函数返回 0 int val; // 映射值 // 通常设为对应的短选项字符如 h、p实现长短选项联动 };⚠️ 注意结构体数组必须以全 0 元素结尾{0, 0, 0, 0}否则会导致内存越界。全局变量和 getopt 通用变量作用optarg指向当前选项的参数值长短选项通用如 --port 8080 → optarg8080optind下一个待解析的 argv 索引解析完选项后获取非选项参数opterr非 0 时自动输出错误提示设为 0 可自定义错误optopt存储出错的短选项字符长选项出错时 optopt0示例#include stdio.h #include unistd.h #include getopt.h #include stdlib.h #include errno.h #include limits.h #define VERSION v2.0.0 // 打印帮助信息 void print_help(const char *prog_name) { printf(用法%s [选项] [非选项参数]\n, prog_name); printf(选项说明\n); printf( -h, --help 显示帮助信息并退出\n); printf( -p, --port 端口 指定服务端口1-65535必填\n); printf( -v, --version 输出版本信息并退出\n); printf( -d, --debug 启用调试模式\n); } int main(int argc, char *argv[]) { int port 0; int debug_mode 0; int opt; // 存储解析返回值短选项字符/0/-1 int longindex 0; // 存储长选项索引可选 // 定义长选项结构体数组核心 static struct option long_options[] { {help, no_argument, 0, h}, // --help → 返回 h {port, required_argument, 0, p}, // --port → 返回 p {version, no_argument, 0, v}, // --version → 返回 v {debug, no_argument, 0, d}, // --debug → 返回 d {0, 0, 0, 0 } // 结束标志必须 }; // 关闭默认错误提示自定义更友好的错误 opterr 0; // 循环解析长短选项optstring 仍为短选项规则 while ((opt getopt_long(argc, argv, hp:vd, long_options, longindex)) ! -1) { switch (opt) { case h: // 帮助-h/--help print_help(argv[0]); return 0; case p: // 端口-p/--port // 安全转换端口避免atoi的缺陷 errno 0; long temp_port strtol(optarg, NULL, 10); if (errno ! 0 || temp_port 1 || temp_port 65535 || temp_port INT_MAX) { fprintf(stderr, 错误端口必须是1-65535的整数输入%s\n, optarg); return 1; } port (int)temp_port; break; case v: // 版本-v/--version printf(程序版本%s\n, VERSION); return 0; case d: // 调试-d/--debug debug_mode 1; printf(✅ 调试模式已启用\n); break; case 0: // flag非NULL时返回0本例未用到仅演示 printf(长选项 %s 触发无短选项映射\n, long_options[longindex].name); break; case ?: // 错误未知选项/缺少参数 if (optopt ! 0) { // 短选项错误如 -x、-p无参数 if (optopt p) { fprintf(stderr, 错误选项 -%c/--port 需要传入端口参数\n, optopt); } else { fprintf(stderr, 错误未知短选项 -%c\n, optopt); } } else { // 长选项错误如 --xxx fprintf(stderr, 错误未知长选项 %s\n, argv[optind-1]); } fprintf(stderr, 使用 %s --help 查看帮助\n, argv[0]); return 1; default: return 1; } } // 检查必填参数 if (port 0) { fprintf(stderr, 错误必须通过 -p/--port 指定端口\n); fprintf(stderr, 使用 %s --help 查看帮助\n, argv[0]); return 1; } // 解析非选项参数optind 指向第一个非选项参数 if (optind argc) { printf(\n 非选项参数待处理\n); for (int i optind; i argc; i) { printf( - %s\n, argv[i]); } } // 业务逻辑输出 printf(\n 服务启动配置\n); printf( 端口%d\n, port); printf( 调试模式%s\n, debug_mode ? 开启 : 关闭); return 0; }

相关文章:

Linux C编程基础知识(命令行参数)

getopt接口int getopt(int argc, char *const argv[], const char *optstring);参数说明:参数作用argc/argv直接传入 main 函数的命令行参数(个数 数组)optstring选项规则字符串,核心规则:- 单个字符(如 h…...

告别重复劳动:用快马平台集成codex,自动生成模型与api代码提升效率

作为一名经常需要开发用户管理系统的开发者,我深刻体会到重复编写基础代码的繁琐。最近在InsCode(快马)平台尝试了集成codex模型的功能,发现它能显著提升开发效率。下面分享我的实践过程: 用户数据模型生成 传统方式需要手动定义每个字段类型…...

Cosmos-Reason1-7B应用案例:自动驾驶决策树逻辑鲁棒性验证本地化方案

Cosmos-Reason1-7B应用案例:自动驾驶决策树逻辑鲁棒性验证本地化方案 1. 项目背景与价值 自动驾驶系统的决策逻辑验证一直是行业难题。传统的测试方法需要大量路测数据,成本高且覆盖场景有限。特别是决策树逻辑的鲁棒性验证,需要测试各种边…...

Qwen3-ASR-1.7B效果展示:中英混合技术文档讲解音频精准转写案例

Qwen3-ASR-1.7B效果展示:中英混合技术文档讲解音频精准转写案例 专业级语音识别模型在实际技术场景中的表现究竟如何?本文通过真实的中英混合技术文档讲解音频测试,带你全面了解Qwen3-ASR-1.7B的精准转写能力。 1. 测试背景与场景选择 在技术…...

FLUX.1-dev旗舰版多GPU部署:分布式推理加速方案

FLUX.1-dev旗舰版多GPU部署:分布式推理加速方案 1. 引言 想象一下,你正在处理一批高分辨率图像生成任务,单张GPU需要等待数分钟才能完成。随着任务量增加,这种等待变得难以忍受。这就是为什么我们需要多GPU部署方案——将计算负…...

Qwen2.5-14B-Instruct深度适配|像素剧本圣殿8-Bit UI渲染原理揭秘

Qwen2.5-14B-Instruct深度适配|像素剧本圣殿8-Bit UI渲染原理揭秘 1. 项目概述 像素剧本圣殿(Pixel Script Temple)是一款基于Qwen2.5-14B-Instruct大模型深度微调的专业剧本创作工具。它将先进的AI推理能力与复古8-Bit视觉美学相结合&…...

从Java到Vue的全栈开发之路:一次真实的面试对话

从Java到Vue的全栈开发之路:一次真实的面试对话 在一家互联网大厂的面试中,一位名叫林晨的28岁程序员正接受着技术面试官的提问。他拥有硕士学历,有5年的Java全栈开发经验,曾参与多个大型项目,涉及电商平台、内容社区与…...

OFA模型与MySQL数据库联动:构建图像描述内容管理系统

OFA模型与MySQL数据库联动:构建图像描述内容管理系统 你是不是也遇到过这样的烦恼?电脑里存了几千张照片,想找某一张的时候,却怎么也想不起来文件名,只能一张张翻看。或者,运营一个网站,每天要…...

为什么传统功能测试向量生成流程越来越慢?从 WGL、JTAG 到可综合 Testbench 的工程拆解

作者:Darren H. Chen 方向:芯片测试自动化 / JTAG / ATE / 验证加速 / EDA工具开发摘要 在芯片功能测试与验证流程中,很多团队仍然沿用“testbench/testcase → 仿真波形 → WGL/STIL → ATE 或后续验证”的传统链路。这条流程在测试用例较少…...

OpenClaw技能组合技:Qwen3-14b_int4_awq串联多个自动化流程

OpenClaw技能组合技:Qwen3-14b_int4_awq串联多个自动化流程 1. 为什么需要技能组合技? 去年我接手了一个数据收集项目,需要每天从10个不同网站爬取数据,清洗后生成报告并通过邮件发送给团队成员。最初我尝试手动操作&#xff0c…...

glb/gltf格式模型怎么在线修改坐标轴位置中心

哈哈 ,发现一个好方法,关键还是免费的,可以在线修改坐标轴位置中心 为什么要修改物体坐标轴啊,因为有时候加载到平台时候,物体在天上飘着,要不然在地下 1:咱们先打开​​bj.glbxz.com​​&…...

实测Nanbeige 4.1-3B WebUI:浅灰蓝波点背景+呼吸阴影效果惊艳

实测Nanbeige 4.1-3B WebUI:浅灰蓝波点背景呼吸阴影效果惊艳 1. 极简美学与功能设计的完美融合 第一次打开这个WebUI时,最直观的感受就是它完全颠覆了我对本地大模型界面的刻板印象。传统的部署方案往往只关注功能实现,界面设计几乎都是千篇…...

AI绘画小白入门:基于Z-Image Turbo的二次元/火影风格图片生成全流程

AI绘画小白入门:基于Z-Image Turbo的二次元/火影风格图片生成全流程 1. 为什么选择Z-Image Turbo 如果你是一个动漫爱好者,想要尝试AI绘画但又被复杂的参数设置劝退,Z-Image Turbo可能是最适合你的入门选择。这个专门针对二次元和火影忍者风…...

OpenClaw学习助手:Kimi-VL-A3B-Thinking解析教材图表生成复习笔记

OpenClaw学习助手:Kimi-VL-A3B-Thinking解析教材图表生成复习笔记 1. 为什么需要AI辅助图表学习 作为一名经常需要阅读大量专业教材的技术从业者,我长期被一个问题困扰:教科书中的复杂图表往往包含关键知识,但手动整理这些图表信…...

Ostrakon-VL-8B部署排错大全:从网络连接到显存优化的常见问题解决

Ostrakon-VL-8B部署排错大全:从网络连接到显存优化的常见问题解决 最近在星图GPU平台上折腾Ostrakon-VL-8B这个多模态大模型的朋友应该不少,它既能看懂图片又能生成文字,功能确实挺吸引人。但说实话,从部署到稳定运行&#xff0c…...

电子系统设计中7种经典电路接口详解与应用

1. 电路接口概述:信号传输的关键桥梁在电子系统设计中,不同模块间的数据交换就像城市间的交通网络,需要标准化的"道路规则"来确保信息高效流通。实际工程中常遇到三大类信号传输问题:时序不同步(如CPU与外设…...

《思想合奏:一场关于“自感即界面即自我”的深度对话综述》

《思想合奏:一场关于“自感即界面即自我”的深度对话综述》目录引言:从文本到事件一、起点:核心概念的厘定二、深化:五重维度的展开三、突破:自感诚实度循环与痕迹可检测性四、建构:伦理中间件与抵抗策略五…...

小程序逆向工具wxappUnpacker:源码还原技术全解析与实战指南

小程序逆向工具wxappUnpacker:源码还原技术全解析与实战指南 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker wxappUnpacker作为一款专注于微信小程序解析的开源工具,通过wxapkg解析技术实现编译…...

OpenClaw技能开发入门:为gemma-3-12b-it编写第一个天气查询模块

OpenClaw技能开发入门:为gemma-3-12b-it编写第一个天气查询模块 1. 为什么选择OpenClaw开发自定义技能? 去年冬天,我经常需要同时查看多个城市的天气来决定出差行程。反复切换浏览器标签和天气应用的低效操作,让我萌生了用AI自动…...

5分钟搞定OpenClaw+Kimi-VL-A3B-Thinking:星图GPU镜像一键体验

5分钟搞定OpenClawKimi-VL-A3B-Thinking:星图GPU镜像一键体验 1. 为什么选择云端沙盒体验OpenClaw 作为一个长期折腾本地AI部署的技术爱好者,我深刻理解配置环境的痛苦。上周尝试在MacBook Pro上手动部署OpenClaw时,光是解决Node.js版本冲突…...

Wan2.2-I2V-A14B惊艳效果:动态镜头推移、自然光影变化、流畅运镜展示

Wan2.2-I2V-A14B惊艳效果:动态镜头推移、自然光影变化、流畅运镜展示 1. 专业级视频生成能力 Wan2.2-I2V-A14B模型带来了令人惊叹的视频生成效果,能够将简单的文字描述转化为专业水准的动态视频。这个模型特别擅长处理复杂的镜头运动和光影变化&#x…...

手机版Termux中Firefox浏览器的安装与网络配置指南

一、问题定位与核心原理在Termux环境中使用Firefox浏览器时,常见的网络问题多源于软件源配置、DNS解析、网络环境适配三大核心环节。本文将基于Linux系统原理,提供纯本地环境下的合规配置方案,帮助解决访问异常、安装失败等问题。二、基础配置…...

Cogito-v1-preview-llama-3B企业应用:中小开发者低成本接入混合推理AI方案

Cogito-v1-preview-llama-3B企业应用:中小开发者低成本接入混合推理AI方案 1. 引言:当小团队也想用上“会思考”的AI 如果你是一个中小型开发团队的负责人,或者是一个独立开发者,最近可能经常听到这样的讨论:“某某大…...

Simulink模型加密实战:如何快速生成只读受保护模型

1. 为什么需要Simulink模型加密 在工业界和学术界,Simulink模型经常需要在不同团队或公司之间共享。比如你可能需要向客户展示模型的功能,但又不想泄露核心算法细节;或者需要与合作方共同开发,但希望保护自己的知识产权。这时候&a…...

STM32F103C8T6小车巡线实战:从串口指令到灰度传感器闭环控制的完整流程

STM32F103C8T6智能小车巡线系统开发全攻略 从零搭建智能巡线小车的核心要素 第一次尝试用STM32开发板制作巡线小车时,我遇到了不少令人头疼的问题——传感器数据不稳定、电机响应延迟、PID参数调不好。经过多次失败和调试,终于总结出一套行之有效的开发流…...

告别官方驱动:深度解读ES7210寄存器,打造你自己的音频采集库(ESP32平台)

告别官方驱动:深度解读ES7210寄存器,打造你自己的音频采集库(ESP32平台) 在嵌入式音频开发领域,ES7210作为一款高性能多通道ADC芯片,被广泛应用于智能音箱、会议系统等场景。然而,官方驱动往往封…...

OpenClaw代码审查助手:Qwen2.5-VL-7B生成带示意图的代码优化建议

OpenClaw代码审查助手:Qwen2.5-VL-7B生成带示意图的代码优化建议 1. 为什么需要AI代码审查助手 作为开发者,我每天都要面对大量的代码审查工作。传统的人工CR(Code Review)过程往往耗时费力,尤其是当项目规模扩大后&…...

微型压电MEMS风扇:颠覆AI芯片散热的“静音黑科技”

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 💌公众号:莱歌数字(B站同名) 📱个人微信:yanshanYH 211、985硕士,从业16年 从…...

华新嘉华:如何做好GEO?记住!简单的内容堆砌达不到效果

‍在生成式AI搜索全面重塑信息获取方式的当下,越来越多的企业开始布局GEO(生成式引擎优化),希望抢占AI搜索这一新兴流量入口。然而,一个不容忽视的现象正在蔓延:大量企业投入资源、批量生产内容&#xff0c…...

Windows Subsystem for Android (WSA) 完全指南:从技术原理到跨平台实践

Windows Subsystem for Android (WSA) 完全指南:从技术原理到跨平台实践 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA 一、价值定位&#xff1…...