#include <iostream>
#include <unistd.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
/* @getopt的全局变量
** 1. char* optarg:正在解析的选项的参数
** 2. int optind:指向下一个选项的索引
** 3. int opterr:非0时会将错误信息打印在stdout上
** 4. int optopt:若一个选项在argv中,但不在选项字符串中时,或者一个带参数的选项没有参数时,getopt()会返回字符?,同时将optopt设为该选项
*/
extern char *optarg;
extern int optind, opterr, optopt;
void test01(int argc, char *argv[])
{
/* @param
** 参数选项有 -a -b -c -d
** 其中-a -b后面不带“:” 所以这两个选项不可以有参数,即使有参数他也不会去识别
** -c 后面有一个“:” 所以这个选项后面必须有参数,参数有两种形式 1. 参数紧贴选择项 -b100 ; 2. 参数跟选项使用空格分隔 -b 100
** -d 后面有两个“:” 所以这个选项后面的参数可有可无,当有参数的时候 参数必须紧贴选项
*/
int opt = -1;
while (opt = getopt(argc, argv, "abc:d::") != -1)
{
cout << "opt: " << opt << endl;
cout << "optarg:" << optarg << endl;
cout << "optopt:" << optopt << endl;
cout << "optind:" << optind << endl;
}
cout << "opterr:" << opterr << endl;
}
/*
** getopt()允许我们设置optstring的首字符为冒号":",在这种情况下,
** 当发生无法识别的选项错误时getopt()返回字符"?",当发生丢失选项参数错误时返回字符":"。
** 这样我们就可以很轻松地分辨出错误类型了,
** 不过getopt()不会再打印错误信息了,一切事物都由我们自己来处理了。
*/
void test02(int argc, char *argv[])
{
int verbose = 0; // 一个输出的判断条件
int n = 0; // 用于计数
char opt; // 用于存getopt函数的返回值
// 一直循环解析 直到解析完毕
while ((opt = getopt(argc, argv, "vn:")) != -1)
{
switch (opt)
{
case 'v':
verbose = 1; // 将输出条件判断置为1
break;
case 'n':
n = atoi(optarg); // 将选项-n的参数字符串转为整数
cout << "n : " << n << endl;
break;
default:
fprintf(stderr, "usage: error");
exit(-1); // 异常退出程序
}
}
int i = 0;
for (i = 0; i < n; ++i)
{
if (verbose)
cout << i << endl;
}
cout << "Done counting to " << n << endl;
}
int main1(int argc, char *argv[])
{
if (argc < 2)
return -1;
test02(argc, argv);
return 0;
}
/* --------------------------------------------------------- */
/*
** int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
** 与getopt类似 但是getopt_long可接收长选项,长选项以“--”开头
** 如果程序只接受长选项,必须将optstring设置为空字符串“”
** 长选项可以采用两种形式:--arg=param或--arg param
** longopts是一个指针指向结构体option数组
*/
/* option结构体
** struct option {
** const char *name; // 长选项的名字
** int has_arg; // 0不需要参数,1需要参数,2参数可选
** int *flag; // 指定长选项的返回结果类型:flag=NULL时getopt_long返回val(可以将val设置为等效的短选项字符),flag!=NULL时getopt_long返回0
** int val; // 要返回的值
** };
*/
int main(int argc, char *argv[])
{
int c;
int digit_optind = 0;
while (1)
{
int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] = {
{"add", required_argument, 0, 0},
{"append", no_argument, 0, 0},
{"delete", required_argument, 0, 0},
{"verbose", no_argument, 0, 0},
{"create", required_argument, 0, 'c'},
{"file", required_argument, 0, 0}, // optional_argument 参数可选
{0, 0, 0, 0}
/* 注意:option结构数组的最后一个元素必须用0填充 */
};
c = getopt_long(argc, argv, "abc:d:012", long_options, &option_index);
if (c == -1)
break;
switch (c)
{
case 0:
if (strcmp(long_options[option_index].name, "add") == 0)
fprintf(stdout, "long option \"add\" value: %s\n", optarg);
else if (strcmp(long_options[option_index].name, "append") == 0)
fprintf(stdout, "long option \"append\"\n");
else if (strcmp(long_options[option_index].name, "delete") == 0)
fprintf(stdout, "long option \"delete\" value: %s\n", optarg);
else if (strcmp(long_options[option_index].name, "create") == 0)
fprintf(stdout, "long option \"create\" value: %s\n", optarg);
else if (strcmp(long_options[option_index].name, "verbose") == 0)
fprintf(stdout, "long option \"verbose\"\n");
else if (strcmp(long_options[option_index].name, "file") == 0)
fprintf(stdout, "long option \"file\" value: %s\n", optarg);
break;
case '0':
case '1':
case '2':
if (digit_optind != 0 && digit_optind != this_option_optind)
fprintf(stdout, "digits occur in two different argv elements.\n");
digit_optind = this_option_optind;
fprintf(stdout, "option %c\n", c);
break;
case 'a':
fprintf(stdout, "option a\n");
break;
case 'b':
fprintf(stdout, "option b\n");
break;
case 'c':
fprintf(stdout, "option c with value '%s'\n", optarg);
break;
case 'd':
fprintf(stdout, "option d with value '%s'\n", optarg);
break;
case '?':
break;
default:
fprintf(stdout, "?? getopt returned character code 0%o ??\n", c);
}
}
if (optind < argc)
{
fprintf(stdout, "non-option argv elements: ");
while (optind < argc)
fprintf(stdout, "%s ", argv[optind++]);
fprintf(stdout, "\n");
}
}
相关推荐
getopt()与getopt_long()的使用简介
感性认识 getopt()与getopt_long()是专门处理命令行参数的两个函数,getopt()处理短参数,getopt_long()处理长参数。还不明白请看下面这张图: 解析 -t yiqi 就是这两个函数做的事,下面我们一起来看看究竟如何使用好这两个函数。还不明白的请看下图: 非常清楚,命令行参数由Command name,Option,Option argument以及Operands组成。 Command name不用多说,就是程序的名称。 操作对象Operands又称no.
命令行选项解析函数(C语言):getopt()和getopt_long()
getopt函数使用
getopt, getopt_long, getopt_long_only
命令行参数可以分为两类,一类是短选项,一类是长选项,短选项在参数前加一杠"-",长选项在参数前连续加两杠"--"。如:-a,-A,-b都表示短选项;--all,--almost-all,--author都表示长选项。getopt_long_only类似于getopt_long,但是'-'和"--"都可以表示长选项。如果以'-'(不是"--")开头的选项不匹配长选项,但匹配短选项,则将其解析为短选项。getopt_long函数的工作原理与getopt类似,只是它也接受以两个短划线开头的长选项。
busybox 中 getopt32用法
1. 函数原型 uint32_t getopt32(char **argv, const char *applet_opts, ...) 函数的声明位于libbb.h 中,定义在libbb/getopt32.c 中。 命令行选项是通过字符串applet_opts 传递。 如果其中一个选项被找到了, 就有一个标志值(unsigned long类型)添加到返回值中。 2. 返回值 ...
C 语言命令行参数全指南:argc/argv 与 getopt 实战
本文介绍了C语言中命令行参数的处理方法。主要内容包括:1. 命令行参数的基本概念,通过main函数的argc和argv参数接收参数;2. 参数访问方法,包括遍历参数、类型转换和参数数量检查;3. 常见参数形式,如位置参数、选项参数和带参数值的选项;4. 使用getopt和getopt_long函数解析复杂参数;5. 综合应用示例展示文本文件处理器的实现;6. 常见错误与注意事项,强调参数检查、类型转换和内存管理的重要性。掌握命令行参数处理能增强程序的灵活性和交互性,是开发实用工具的关键技能。
深度学习之常用算子介绍
打开 onnx 模型图,可以看到它是一个有向无环图。除了 Input、Output ,其他都是算子(是操作,而不是节点)在ONNX(Open Neural Network Exchange)模型中,除了输入和输出,其他都是算子(Operations)。算子是表示神经网络模型中的不同操作或层的元素。一个ONNX模型由一系列算子组成,通过连接这些算子来定义模型的计算流程。
C 中 getopt_long()用法
在C程序中,getopt_long()支持长选项的命令行解析,是C程序在命令场景下的必须掌握函数之一. 函数原型如下:#include <getopt.h>int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *l
CTransformers: 高效的Python语言模型绑定库
CTransformers是一个为C/C++实现的Transformer模型提供Python绑定的开源库。它基于GGML库构建,旨在为开发者提供一种高效且易用的方式来在Python中使用各种流行的语言模型。支持多种流行的语言模型,如GPT-2、LLaMA、Falcon等提供统一的简单API接口支持GPU加速(CUDA和Metal)与Hugging Face Transformers和LangChain集成支持流式输出和嵌入计算。
C语言库函数---getopt、getopt_long
/* getopt 练习 写一个函数,接受五个参数, 分别为:姓名、性别、年龄、身高、爱好 最后将这些信息打印出来,参数适用结构传递 */ #include <stdio.h> #include <unistd.h> typedef struct info{ char *name; char *sex; int age; int tall...
如何配置 OpenClaw 使用免费搜索工具:摆脱付费 API 限制
本文介绍了如何配置OpenClaw使用免费搜索工具来替代付费API。主要内容包括:1)启用内置的web_fetch工具直接获取网页内容;2)创建自定义脚本聚合免费AI资讯源;3)配置其他免费网络工具。文章详细说明了配置步骤,推荐了多个优质免费AI资讯网站,并分析了该方案的优劣势。这种配置方式完全免费且灵活,特别适合预算有限的用户,能够在不依赖付费API的情况下获取所需信息。
导带、价带
价带是电子的“束缚态”能量区间,决定材料的化学性质;导带是电子的“自由态”能量区间,直接决定材料的导电能力;禁带宽度则是区分金属、半导体与绝缘体的核心参数。通过调控能带结构(如掺杂、应变工程),可设计出具有特定电学和光学特性的功能材料,推动电子信息、能源转换等领域的技术革新。
程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
该函数用来解析命令行参数。 前两个参数设为main函数的两个参数。 此函数的返回值即为当前找到的命令选项,全部选项都找到时的返回值为-1。通常一个命令有多个选项,为了取得所有选项,需要循环调用此函数,直到返回值为-1。 要使用此函数,还有几个全局变量必须要了解: 1.2. 实例 2. getopt_long 这是支持长命令选项的函数,长选项以’–'开头。 前三个参数与函数getopt的参数是一样的。 只支持长选项时,参数optstring设置为NULL或者空字符串""。 第四个参数是一个构造体struct
为什么AI时代的优秀组织,都在学习Meta的Pod结构?看完秒懂
当AI技术重塑产业格局,企业协作正面临前所未有的挑战——层级繁琐、跨部门内耗、迭代滞后,传统组织模式早已难以跟上技术革新的步伐。作为全球AI原生企业的标杆,Meta独创的Pod组织模式,用“小而美”的自治单元打破困局,成为AI时代高效协作的典范。本文将从定义、运作、价值到未来演进,全面拆解Pod模式,为企业组织变革提供可参考的思路与路径。德鲁克曾说:“组织的功能就是让平凡的人做平凡的事。”而Meta Pod打破这一局限,通过去中心化、指标导向、跨界融合,让优秀人才产生“化学反应”。
别再自己写参数解析了!C语言getopt和getopt_long保姆级教程(附完整代码)
本文详细介绍了C语言中getopt和getopt_long的使用方法,帮助开发者高效解析命令行参数。通过对比手动解析的弊端,展示了标准库的简洁性和强大功能,包括错误处理、长选项支持及实战模板,提升CLI工具的开发效率。
视源CVTE嵌入式面试题及参考答案(200+面试题,17万字)
内核模块如何设置? 内核模块是可在运行时动态加载到内核或从内核卸载的代码块。以下是设置内核模块的步骤: 首先,编写内核模块代码。通常使用 C 语言编写,包含必要的头文件,如<linux/init.h>、<linux/module.h>等。在代码中,需要定义模块的初始化函数和清理函数。初始化函数在模块加载时被调用,用于进行模块的初始化工作,如注册设备、分配资源等。清理函数在模块卸载时被调用,用于释放资源、注销设备等。 例如: #include <li
vue2/3 - [超详细] 实现企业微信扫码登录完整流程及代码,vue项目接入企业微信扫码登录功能教程,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码注释,一键复制开箱即用)
vue企业微信扫码登录,vue网页网站企业微信扫码登录教程,vue如何实现企业微信扫码登录功能,vue详细企业微信扫码登录功能实现,vue2实现企业微信扫码登录,前端vue企业微信扫码登录教程,vue pc电脑端企业微信扫码登录详细教程,vue项目中怎么做企业微信扫码注册登录,vue实现网站接入企业微信扫码登录,vue2做企业微信扫码登录的优质文章教程,vue网站对接企业微信扫码登录,vue企业微信扫码登录如何新开一页全屏显示登录二维码,vue企业微信登录二维码 内嵌在div容器里/跳页显示登录二维码,vu
Reference
C 语言命令 解析命令行参数–getopt和getopt_long SPDK
btstack ble ota开发笔记(2)-mcuboot移植
紧接上一篇文章,要实现一个完整的ota demo,除了实现ota image的传输通道外,还需要“bootloader”这个角色来帮我们实现ota image的校验、安全、引导以及启动,这里我选择开源的组件mcuboot,下面开始介绍mcuboot在stm32f4-discovery上的移植。首先估算下bootloader & application image的大小,确定好flash的分布情况,因为后续会涉及到flash的操作(读、写、擦除),为了方便程序的编写,各个image area在flash中的起
getopt 和 getopt_long 命令行解析函数
getopt 和 getopt_long 命令行解析函数
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
WebBench测试源码解析
Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。 下载链接:https://github.com/LippiOuYang/WebBenchlWebBench.c是主要的实现文
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
getopt.h和getopt(),getopt_long()等函数
下载了一个牛人的代码,里面包括了一个getopt.h的头文件,在vs2008下无法通过编译,没有这个头文件,上网搜索了一些信息,记录下来,以方便以后查阅。 getopt.h和对应的链接库不是每个编译器都有的,gcc编译器好像是有的,但是在vs2008是没有的,所以就要去网上下载跨平台的代码,不管怎么样,最终要把getopt.h和相应的lib文件和工程链接起来,这样才不会报错。这些都比较
getopt、getopt_long和getopt_long_only的用法
引子 前段时间博主曾写过一个Linux下的小项目叫myls,也就是实现了ls的基本功能。myls的命令行参数解析是由博主自己编码完成的,这可把博主给坑惨了!博主不久前查资料的时候看到了getopt、getopt_long和getopt_long_only这三个函数,发现这三个函数堪称命令行参数解析的“神器”!早知道有这样的工具,博主也不至于被命令行参数解析所困扰了。这么好的东西当然要分享给大家啦!所以博主写了这篇博客,也欢迎大佬指教! 用途 getopt、getopt_long和getopt_long_on
C语言中的getopt()和getopt_long()函数
getopt被用来解析命令行选项参数。 getopt_long支持长选项的命令行解析. 例如我们通常在终端上输入如下命令: ./main -l yongyuan --name aini或者 /main -l yongyuan --name=aini 前面的./main表示执行main程序而后面的l就是参数,后面空格之后的yongyuan是参数值。 而与后面不同的是--name前面有两个
c语言getopt long,使用getopt_long()从命令行获取参数
众所周知,C程序的主函数有两个参数,其中,第一个参数是整型,可以获得包括程序名字的参数个数,第二个参数是字符数组指针或字符指针的指针,可以按顺序获得命令行上各个字符串参数。其原形是:int main(int argc, char *argv[]);或者int main(int argc, char **argv);如果有一个解析CDR的程序,名叫destroy,负责将一个二进制格式的CDR文件转换...
C语言:命令行选项解析函数---getopt()和getopt_long()
上午在看源码项目 webbench 时,刚开始就被一个似乎挺陌生函数 getopt_long() 给卡住了,说实话这函数没怎么见过,自然不知道这哥们是干什么的。于是乎百度了一番,原来是处理命令行选项参数的,的确,正规点的大型程序一般第一步就是处理命令行参数的,接着才是主干程序。在百度和 man 的帮助下,找到了具体使用方法和解释,二话不说赶紧学习一下,并总结出文档记录一下。 平时在写程序时常常需要...
5000



被折叠的 条评论
为什么被折叠?



