C/C++ 命令解析:getopt 方法详解和使用示例

article/2025/10/20 3:47:01

一、简介

getopt() 方法是用来分析命令行参数的,该方法由 Unix 标准库提供,包含在 <unistd.h> 头文件中。

 

二、定义

int getopt(int argc, char * const argv[], const char *optstring);extern char *optarg;
extern int optind, opterr, optopt;

getopt 参数说明:

  • argc:通常由 main 函数直接传入,表示参数的数量
  • argv:通常也由 main 函数直接传入,表示参数的字符串变量数组
  • optstring:一个包含正确的参数选项字符串,用于参数的解析。例如 “abc:”,其中 -a,-b 就表示两个普通选项,-c 表示一个必须有参数的选项,因为它后面有一个冒号

外部变量说明:

  • optarg:如果某个选项有参数,这包含当前选项的参数字符串
  • optind:argv 的当前索引值
  • opterr:正常运行状态下为 0。非零时表示存在无效选项或者缺少选项参数,并输出其错误信息
  • optopt:当发现无效选项字符时,即 getopt() 方法返回 ? 字符,optopt 中包含的就是发现的无效选项字符

 

三、实例分析

让我们通过一系列的实例来掌握 getopt 方法的使用吧。

1. 简单实例

OptDemo.c 如下:

#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[]) {int o;const char *optstring = "abc:"; // 有三个选项-abc,其中c选项后有冒号,所以后面必须有参数while ((o = getopt(argc, argv, optstring)) != -1) {switch (o) {case 'a':printf("opt is a, oprarg is: %s\n", optarg);break;case 'b':printf("opt is b, oprarg is: %s\n", optarg);break;case 'c':printf("opt is c, oprarg is: %s\n", optarg);break;case '?':printf("error optopt: %c\n", optopt);printf("error opterr: %d\n", opterr);break;}}return 0;
}

编译和运行:

分析:

命令 gcc OptDemo.c -o OptDemo 是使用 gcc 把 OptDemo.c 编译成可执行程序,命名为 OptDemo

第一次运行 ./OptDemo -a -b -c afei 正常执行和输出

第二次运行 ./OptDemo -abc 由于选项 c 后没有输入参数,于是报错

第三次运行 ./OptDemo -d 由于选项 d 不是我们在 optstring 中预定义的选项,于是报错

 

2. 可选参数

一个冒号表示选项后必须有参数,没有参数就会报错。如果有两个冒号的话,那么这个参数就是可选参数了,即可有可没有。
OptDemo.c 如下:

#include <stdio.h>
#include <unistd.h>void usage() {printf("Usage:\n");printf("\tOptDemo [-a] [-b] [-c message]");
}int main(int argc, char *argv[]) {int o;const char *optstring = "abc::"; // 有三个选项-abc,其中c选项后有两个冒号,表示后面可选参数while ((o = getopt(argc, argv, optstring)) != -1) {switch (o) {case 'a':printf("opt is a, oprarg is: %s\n", optarg);break;case 'b':printf("opt is b, oprarg is: %s\n", optarg);break;case 'c':printf("opt is c, oprarg is: %s\n", optarg);break;case '?':printf("发生错误时提示用户正确的使用方式\n");usage(); // 提示使用说明break;}}return 0;
}

编译和运行:

分析:

注意这里 可选参数 选项 -c 后面跟参数的时候,一定不能有空格。

但是如果是 必选参数,即选项后面只有一个冒号,则是有没有空格都可以。

 

3. 输入字符串转 int

由于 optarg 都是字符串类型的,所以当我们想要整型的输入参数时,会经常用到 atio() 这个方法,这里也简单介绍一下。
atoi (表示 ascii to integer) 是把字符串转换成整型数的一个函数,包含在 <stdlib.h> 头文件中,使用方式如下:

int num = atoi(optarg);


http://chatgpt.dhexx.cn/article/dmBUOAUG.shtml

相关文章

*args和**kwargs

*args和**kwargs的区别 首先*args和**kwargs的区别主要是*和**的区别&#xff0c;与变量名args和kwargs无关&#xff0c;也可以命名成*cat和**dog&#xff1b;*args接收不带变量名的变量&#xff0c;**kwargs接收带变量名的变量。*args和**kwargs可以共同使用&#xff0c;但是顺…

python中argparse模块关于 parse_args() 函数详解(全)

目录 前言1. 函数讲解2. 基本用法3. 实战讲解 前言 原理&#xff1a;命令行解析使用argparse包作用&#xff1a;命令行传参赋值 可用在机器学习深度学习 或者 脚本运行等 了解这个函数需要了解其背后的原理以及具体参数 1. 函数讲解 在深度学习模型框架中几乎都有的模块 浓…

java打印args的内容_解决java main函数中的args数组传值问题

这几天面试中有遇到关于main数组中的args数组传值的问题,一般是从命令提示符中传值,也可以直接在java代码中赋值。 而且这个数组的长度是动态的,根据传值的个数确定数组的长度。 1.从命令提示符中传值 我在桌面新建了一个文本文档重命名为testmain.java,代码如下 public cl…

k8s args和command

首先先看一下busybox.yaml apiVersion: apps/v1 kind: Deployment metadata:name: app spec:replicas: 2template:metadata:labels:name: appspec:containers:- name: appimage: busybox:1.28.4 #内置的linux大多数命令&#xff0c;多用于测试args:- /bin/sh- -c- slee…

java args的用法_Java中args参数数组的用法说明

main方法args参数用于接收用户输入的参数&#xff0c;参数以字符串形式存放在数组中。 这里将传递参数参数的形式分两种&#xff0c;一种是传递普通参数&#xff0c;另一种是传递含有空格的参数。 1、传递普通参数 public class Test { public static void main(String[] args)…

java args什么意思_java中args是什么意思?

在java中&#xff0c;args是arguments的缩写&#xff0c;是指字符串变量名&#xff0c;属于引用变量&#xff0c;名字代号而已&#xff0c;只是一个默认名&#xff0c;可以自己取的&#xff0c;一般都习惯性照写。String[] args是main函数的形式参数&#xff0c;可以用来获取命…

python args函数_Python函数参数*args 和**kwargs的用法

args就是所有参数的数组&#xff0c;kwargs就是当你传入keyvalue是存储的字典&#xff0c;当函数的参数不确定时&#xff0c;可以使用*args 和kwargs&#xff0c;*args 没有key值&#xff0c;kwargs有key值 def fun_var_args(farg, *args): print "arg:", farg for v…

java args用法_Java中args参数数组的用法说明代码

本篇文章小编给大家分享一下Java中args参数数组的用法说明代码&#xff0c;文章代码介绍的很详细&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家供大家参考&#xff0c;有需要的小伙伴们可以来看看。 main方法args参数用于接收用户输入的参数&#xff0c;参数以字符串…

C语言关键字浅析-return

### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### return关键字是C程序中最常见的关键字之一 对于一个最简单的demo程序&#xff0c;或者说你最早接触的HELLO WORLD程序&#xff0c;里面至少有两个你最早见到的关键字 int和return&#xff08;注意&#xff0c;inclu…

C语言关键字之inline

简介 inline放在函数返回类型前修饰函数&#xff0c;被修饰的函数就叫做内联函数。 static inline void function&#xff08;void&#xff09;在C语言中&#xff0c;函数调用时保存现场&#xff0c;函数中变量的使用等都会占用栈空间。而且进入函数前的保存现场&#xff0c;…

C语言关键字详解(五)带你全面了解 volatile 关键字

目录 一、前言二、最易变的关键字—volatile1、volatile 总体阐述2、CPU运算与内存覆盖3、线程与执行流4、volatile修饰变量 三、总结 一、前言 大家好&#xff0c;欢迎来到C语言深度解析专栏—C语言关键字详解第五篇&#xff0c;在本篇中我们将会介绍C语言当中的另外一个重要的…

c语言关键字之auto

文章目录 1.c语言中&#xff0c;关键字auto用于声明一个变量为自动变量2.c语言中&#xff0c;只使用auto修饰变量&#xff0c;变量的类型默认为整型3.c中&#xff0c;关键字auto是一个类型说明符题目&#xff1a;编写一段程序&#xff0c;读入一段包含标点符号和空格的字符串&a…

C语言深度解剖——C语言关键字

每天进步一点点&#xff0c;坚持带来大改变&#xff01;&#xff01;&#xff01; 前言&#xff1a; 在C语言的学习过程中会遇到许多的关键字&#xff0c;我们是否真的详细了解这些关键字的使用方法和使用场景&#xff0c;下面我们来详解C语言中的32个关键字 1.C语言关键字概览…

c语言标识符与关键字的关系,C语言关键字与标识符

没有人有资格干涉你的梦想&#xff0c;同样的&#xff0c;也没有人有义务支持你的梦想。能让你坚持或放弃的&#xff0c;终究只有你自己。 标识符 只能以数字&#xff0c;字母和下划线组成&#xff0c;但第一个不能以数字开头。用户自己使用一般第一个也不用下划线(当然也不会出…

c语言什么是关键字,c语言关键字是什么

c语言关键字是什么&#xff1f; c语言关键字又称为保留字,就是已被C语言本身使用,不能作其它用途使用的字。 C语言简洁、紧凑&#xff0c;使用方便、灵活。ANSI C标准C语言共有32个关键字&#xff0c;9种控制语句&#xff0c;程序书写形式自由&#xff0c;区分大小写。把高级语…

C语言的32个基本关键字

1、数据类型关键字&#xff08;12个&#xff09; (1) char &#xff1a;声明字符型变量或函数 注&#xff1a;char 占一个字节&#xff0c;也就是 8 个二进制位&#xff0c;但它表示的是有符号的类型&#xff0c;所以表示的范围是 -128~127 &#xff1b;uchar 表示无符号的类型…

C语言的32个常用关键字

目录 前言 一、关键字是什么&#xff1f; 二、关键字使用方法 1.关键字分类 2.使用方法&#xff08;详解&#xff09; 1.数据类型关键字 int&#xff0c;float&#xff0c;double&#xff0c;charshort&#xff0c;long&#xff0c;signed&#xff0c;unsignedunion&#x…

C语言32个关键字详解

以下内容建议大家收藏&#xff0c;全是干货&#xff0c;建议反复观看&#xff01;&#xff01;&#xff01; Lets Go ! ! ! 首先我们把 C89(C90) 的所有关键字进行一下分类&#xff0c;方便大家理解。 数据类型关键字(12个)&#xff1a; char、short、int、long、signed、unsi…

android将手机能当蓝牙耳机使用吗,一种利用android手机作为蓝牙适配器的蓝牙耳机测试系统及其测试方法与流程...

本发明涉及蓝牙耳机测试的技术领域,特别涉及一种利用android手机作为蓝牙适配器的蓝牙耳机测试系统及其测试方法。 背景技术: 目前蓝牙耳机测试采用如下技术方案: 1、开发蓝牙适配器: 从耳机厂商处获取配置信息,根据配置信息开发蓝牙dongle(蓝牙适配器); 2.测试蓝牙耳机:…

手机音频口通信

1. 为什么用音频口通信而不用其他接口&#xff1f; 原因是音频口简单、廉价、每个智能手机上都有而且有大量的资料可供查阅。其他的接口诸如usb&#xff0c;firewire等&#xff0c;有的只是安卓手机上有&#xff0c;有的只是iPhone手机上有&#xff0c;即使是一般安卓手机上…