argc,argv是什么

article/2025/10/1 6:13:23

来源:微信公众号「编程学习基地」

文章目录

      • argc,argv是什么
      • 如何解析程序参数
        • “选项”是什么?
        • "选项字符串"是什么
        • 解析参数

argc,argv是什么

如果你是一个 Linux 开发者,那么你一定需要给应用程序传递参数。

刚接触C语言的童鞋,学的第一个程序一定是这样的

#include<stdio.h>
int main()
{printf("hello world\n");
}

接触完 Linux 下C语言编程的童鞋,他会这样做

#include<stdio.h>
int main(int argc,char*argv[])
{printf("argc:%d,argv[0]:%s\n",argc,argv[0]);
}

这个argc,argv有什么用?,先看下输出结果

# ./main 
argc:1,argv[0]:./main

我们传递一个参数看看

# ./main -v
argc:2,argv[0]:./main

可以大概猜一下,argc跟命令行参数数量有关,argv跟命令行参数有关

修改下程序试着获取传递的参数

#include<stdio.h>
int main(int argc,char*argv[])
{for(int index=0;index<argc;index++){printf("argc:%d, argv[%d]:%s\n",index,index,argv[index]);}
}

测试一下效果

# ./main
argc:0, argv[0]:./main
# ./main -p
argc:0, argv[0]:./main
argc:1, argv[1]:-p
# ./main -p 80
argc:0, argv[0]:./main
argc:1, argv[1]:-p
argc:2, argv[2]:80

这次可以确定了,argc是传递给应用程序的参数个数,argv是传递给应用程序的参数,且第一个参数为程序名。

如何解析程序参数

既然argc,argv可以传递参数,那我们如何分析命令行参数?

这里有个函数给大家介绍下

#include <unistd.h>
int getopt(int argc, char * const argv[],const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

函数说明:getopt()用来分析命令行参数。
1、参数argc 和argv 是由main()传递的参数个数和内容
2、参数optstring 则代表准备处理的选项字符串

“选项”是什么?

在linux下大家都用过这样一条指令吧:gcc -o main main.cpp

这条指令中的 -o 就是命令行的选项,后面的 main-o 选项所携带的参数

有些选项是不用带参数的,而这样不带参数的选项可以写在一起,例如 rm -rf

"选项字符串"是什么

先看例子吧,"a:b:cd::e",这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。

冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数,没有参数就会报错。

参数的输入形式 -p80 或者 -p 80,都表示 80 是 -p 的参数。

两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数。

需要注意的是两个冒号之间不能有空格。

解析参数

了解完选项和选项参数之后就是通过 getopt 这个函数解析参数了

在此之前了解一下几个全局参数

extern char *optarg; 用来保存选项的参数

extern int optind 用来记录下一个检索位置

opterr 是否将错误信息输出到stderr,为0时表示不输出

optopt 保存的是无法识别的选项

大概了解完之后,我们的示例程序如下

#include <stdio.h>
#include <unistd.h>
int main(int argc,char*argv[])
{int optch = 0;while((optch = getopt(argc, argv, "a:b:cd::e")) != -1){// printf("optind: %d\n", optind); //下一个检索位置,即选项的参数位置switch (optch){case 'a':printf("-a %s\n", optarg);break;case 'b':printf("-b %s\n", optarg);break;case 'C':case 'c':printf("-c %s\n", optarg);break;case 'd':printf("d:%s\n", optarg);break;case 'e':printf("-e %s\n", optarg);break;case '?':printf("Unknown option: %c\n",(char)optopt);    //表示不在选项字符串optstring中的选项break;default:break;}}// printf("opterr:%d\n",opterr);  //opterr表示是否将错误信息输出到stderr,为0时表示不输出
}

测试程序的选项字符串是a:b:cd::e ,对应的是几个case标签,执行程序分别验证下

a和b有一个 : ,所以a,b选项后面必须携带参数

# ./main -a test
-a test
# ./main -b 
./main: option requires an argument -- 'b'
Unknown option: b

不携带参数的话就会无法识别参数

c和e没有 : ,所以 c 选项就类似于 -version 一类的选项

# ./main -c
-c (null)
# ./main -c test
-c (null)

d有两个: ,所以d选项的参数是可选的,但是要注意参数与选项之间不能有空格

# ./main -dtest
d:test
# ./main -d test
d:(null)

Linux基础知识科普就介绍到这里,下一期是关于文件操作的。


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

相关文章

数学符号arg的含义

argument of the maximum/minimum arg max f(x): 当f(x)取最大值时&#xff0c;x的取值 arg min f(x)&#xff1a;当f(x)取最小值时&#xff0c;x的取值 表示使目标函数取最小值时的变量值 From Wikipedia In mathematics, arg max (or argmax) stands for the argument of…

arg和*argv[]是什么?

我们知道main函数的标准原型应该是int main(int argc, char *argv[]);。argc是命令行参数的个数&#xff0c;argv是一个指向指针的指针。那为什么要写成char *argv[]而不写成char argv呢&#xff1f;这样写给表示argv不是指向单个指针&#xff0c;而是指向一个指针数组的首元素…

数学符号arg含义

argument of the maximum/minimum arg max f(x): 当f(x)取最大值时&#xff0c;x的取值 arg min f(x)&#xff1a;当f(x)取最小值时&#xff0c;x的取值 表示使目标函数取最小值时的变量值 From Wikipedia In mathematics, arg max (or argmax) stands for the argument of…

MLT解读

简介 在很多方法都在检测上做文章的时候&#xff0c;能看到MLT这样一篇在Public赛道做研究并取得相当好的效果的文章是很难得的&#xff0c;就像论文的标题一样&#xff0c;它直面了MOT目前针对二维图像的一个痛点&#xff0c;那就是遮挡问题尤其是密集人群场景下的遮挡问题。…

什么是TLB ?

TLB:Translation Lookaside Buffer. 根据功能可以译为快表&#xff0c;直译可以翻译为旁路转换缓冲&#xff0c;也可以把它理解成页表缓冲。里面存放的是一些页表文件&#xff08;虚拟地址到物理地址的转换表&#xff09;。当处理 器要在主内存寻址时&#xff0c;不是直接在内存…

G i t

Git 1、Git 概述1.1、版本控制工具 2、Git 常用命令★★★★2.1、设置用户签名★★★★2.2、初始化本地库★★★★2.3、查看本地库状态$ git status2.4、添加暂存区$ git add 文件名2.5、提交本地库2.6、修改文件$ vim 文件名2.7、历史版本 3、Git 分支操作3.1、分支的操作&am…

Megatron-LM GPT2

内容 使用原始 Megatron-LM 训练 GPT-2 训练数据设置运行未修改的 Megatron-LM GPT2 模型启用 DeepSpeed 参数解析初始化和训练 初始化使用训练 API 前向传播反向传播更新模型参数损失缩放检查点保存和加载DeepSpeed 激活检查点&#xff08;可选&#xff09;训练脚本使用 GPT-…

代码评审与LGTM

为什么80%的码农都做不了架构师&#xff1f;>>> 关于codereview&#xff0c;https://www.douban.com/note/593670479/ 在Google&#xff0c;系统保证了只有经过Critique评审通过的代码才能被提交进代码仓库Piper。 每个目录都有几个“owners”&#xff0c;通常是相…

lnmt

lnmt 简介 lnmt&#xff1a; 表示的是 linux nginx mysql tomcat 的简称 Apache 为HTML页面服务&#xff0c;而Tomcat实际上运行JSP页面和Servlet&#xff0c;Tomcat实际上运行JSP页面和Servlet&#xff0c;Tomcat处理静态HTML的能力不如Apache服务器 了解更多Tomcat 内容请…

社区出品|LGTM :数据圈内的周度「热点精选」

&#x1f4e2;「LGTM」的意思是指&#xff1a;在我看来不错 (Looks Good to Me)&#xff0c;这是代码审阅者在批准 CL 时说的常用语。ShardingSphere 社区开辟一个全新的内容专栏——「LGTM 专栏」致力为您带来业界最佳新闻&#xff0c;让您在 5 分钟内了解科技&#xff01;另外…

怎么开启远程重启服务器,怎么正确重启服务器

对于从事互联网行业的工作人员来说&#xff0c;远程桌面连接不上是一种很常见的情况&#xff0c;这个时候重启服务器是一种最直接最有效的解决办法&#xff0c;但是重启服务器也是分好几种方法的&#xff0c;下面就随着小编来了解一吧。 服务器连接不上的原因有以下几种&#x…

虚拟机重启服务器命令,虚拟机中重启命令

虚拟机中重启命令 内容精选 换一换 本章节介绍通过执行virsh edit vmx命令编辑虚拟机配置文件的操作方法,其中vmx是虚拟机名称。虚拟机的CPU绑定,是指将VM的vcpu绑定到同一个NUMA节点的物理CPU上。以将虚拟机的4个vcpu分别绑定到0/1/2/3物理核为例,介绍虚拟机CPU绑定的配置方…

xshell开启文件服务器的命令,xshell重启服务器命令

xshell重启服务器命令 内容精选 换一换 以NTP服务器、DNS服务器的操作系统均为SUSE为例:登录Linux弹性云服务器。执行以下命令,切换至root用户。sudo su -sudo su -执行以下命令,编辑ntp.conf文件。vim /etc/ntp.confvim /etc/ntp.conf添加以下语句,配置NTP服务器。server …

服务器系统重启命令,服务器重启命令

服务器重启命令 内容精选 换一换 openEuler,EulerOS,CentOS 8.0及以上操作系统默认开启SElinux强制模式,会导致工具安装失败。若想关闭SElinux强制模式,执行以下操作。临时关闭执行以下命令查询SELinux状态。sestatusCurrent mode显示enforcing表示SELinux已开启强制模式。…

MyBatis 拦截器执行顺序

1.原始 jdbc 工作流程 原始 jdbc 工作流程 以查询为例 1.1 加载驱动 Class.forName(Driver.class.getName()) 1.2 建立数据库连接 Connection root DriverManager.getConnection(“xx”, “xx”, “xx”) 1.3 预编译sql语句 PreparedStatement preparedStatement root.prep…

Mybatis拦截器打印sql

在项目中,通常会配置log4j2等来输出mybatis的sql,为了防止sql注入问题,我们通常会使用#{}的方式来注入sql的参数,这会导致我们拿到的sql日志是没替换参数的,参数都是通过问号?占位符的方式。当我们需要拿下sql去数据库客户端执行的时候,就会有一个困扰:需要把一个个问号…

mybatis拦截器实现权限管理

框架设计 基于Spring SecurityJWT技术实现登录认证和访问授权&#xff0c;基于Mybatis 拦截器实现数据权限的控制。由于已有前文介绍Spring Security如有兴趣可以查看&#xff0c;在此将重点于数据权限的实现及菜单等表结构的设计。 Mybatis 拦截器 介绍Mybatis拦截器之前先来了…

Mybatis拦截器失效

现象&#xff1a; 自定义插件注册成功&#xff0c;但是始终不进入拦截器方法&#xff1b; 我的拦截器&#xff1a; 排查 Mybatis拦截器是采用的责任链模式&#xff0c;一般拦截器中intercept方法中最后执行 invocation.proceed() 方法&#xff0c;将拦截器责任链向后传递&…

MyBatis拦截器实现原理

Mybatis拦截器并不是每个对象里面的方法都可以被拦截的。Mybatis拦截器只能拦截Executor、StatementHandler、ParameterHandler、ResultSetHandler四个类里面的方法&#xff0c;这四个对象在创建的时候才会创建代理。 用途&#xff1a;实际工作中&#xff0c;可以使用Mybatis拦…

自定义MyBatis拦截器

文章目录 自定义MyBatis拦截器作用MyBatis中的四大核心对象在mybatis中可被拦截的类型有四种(按照拦截顺序)拦截器需要实现Mybatis提供的Interceptor接口利用反射获取运行中的实体字段的名字利用反射动态的为sql语句传递新参数使用mybatis自定义的拦截器为插入&#xff0c;更新…