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

C语言获取命令行选项(option/flag)和输入的内容的一种巧妙的办法

我之前有篇博客《C语言中函数main的参数argc和argv是什么》中写到 Unix 命令行选项的惯例是在选项前面加上一个-,用来区分选项名和参数。

原文中提到的方法是用switch判断,我也觉得这个方法很不错,但是最近又发现了一种方法,所以这里作为储备记录一下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	//为了exit(-1)int main(int argc, char *argv[]) {for (int i = 1; i < argc; i+=2) {//下面所有的exit(-1)都可以改成自己所需的错误输出和处理函数if (i + 1 >= argc) { exit(-1); } //选项后面必须有参数if (argv[i][0] != '-') { exit(-1); } //选项必须有“-”,换句话说,一对选项和参数必须由“-”开头if (argv[i][1] == 'a') { printf("-a option, value is %s\n", argv[i + 1]); } //识别选项-a,并且输出其参数else if (argv[i][1] == 'b') { printf("-b option, value is %s\n", argv[i + 1]); } //识别选项-b,并且输出其参数else { exit(-1); } //错误选项,退出程序}return 0;
}

这个方法很难说比之前那个方法好还是不好,但是在处理一种情况的时候可能会好一些,就是当你必须要有一个参数,但这个参数并没有选项的时候。

举个例子,比如说用户必须输入一个地址,当然你可以使用-i,但是也可以直接用最后的else来获取地址。如果输入地址不正确,再进行错误处理。

如果你看过我之前的那篇博客《C语言中函数main的参数argc和argv是什么》,那么这里需要解释的应该只有两个地方:

  • 上面代码中的argv[i][1]其实表示的是argv数组中第i个元素的第 2 个字符(从0开始的),也就是跳过了第一个字符-
  • argv[i + 1]则表示第i+1个字符串,也就是选项后面的参数。

希望能帮到有需要的人~

相关文章:

  • Rockchip平台rk3588源码下载编译(基于Android13)
  • 【搭环境】装Python3.8 open3d
  • 网络运维与网络安全 学习笔记2023.11.23
  • thingsboard3.6的mailConfigTemplateController错误
  • chatglm3部署使用
  • 网络运维与网络安全 学习笔记2023.11.22
  • 使用websocket获取thingsboard设备的实时数据
  • 贪心:leetcode2216 美化数组的最少删除数
  • Pickcode:教孩子们编码的新视觉语言
  • Python 使用SQLAlchemy数据库模块
  • logic-flow 使用过程中遇到的bug - 拖动节点到画布的时候,鼠标松开,节点不落在画布,仍旧跟着鼠标走
  • 【23真题】最后一套两电一邮,纸老虎偏多!
  • go sync.map源码解读
  • UDP网络套接字编程
  • JS——日期字符串yyyymmdd转yyyy-mm-dd的两种方法
  • @jsonView过滤属性
  • [LeetCode] Wiggle Sort
  • 5、React组件事件详解
  • Android优雅地处理按钮重复点击
  • EventListener原理
  • Java的Interrupt与线程中断
  • js如何打印object对象
  • Linux中的硬链接与软链接
  • php ci框架整合银盛支付
  • Terraform入门 - 1. 安装Terraform
  • Vue官网教程学习过程中值得记录的一些事情
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 聊聊directory traversal attack
  • 如何选择开源的机器学习框架?
  • 算法系列——算法入门之递归分而治之思想的实现
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (转)setTimeout 和 setInterval 的区别
  • (转载)Linux 多线程条件变量同步
  • .net Signalr 使用笔记
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 事件模型教程(二)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .ui文件相关
  • @JsonFormat与@DateTimeFormat注解的使用
  • @Transactional 详解
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [delphi]保证程序只运行一个实例
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
  • [LeetCode 687]最长同值路径
  • [Linux]创建新用户并授予root权限
  • [Linux]如何理解kernel、shell、bash