argc,argv是什么
来源:微信公众号「编程学习基地」
文章目录
- 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基础知识科普就介绍到这里,下一期是关于文件操作的。
argc,argv是什么相关推荐
- glutInit(argc, argv); glut初始化API
int main(int argc, char **argv){} int argc 和 char **argv 传递 到 你的自定义函数,再传递给 glutInit(). ------------- ...
- CMake中的ARGC ARGV 和ARGN参数意义
编写或者查看一些开源cmake文件中经常遇到在宏(macro)和函数中经常会遇到ARGC ARGV 和ARGN等参数,该参数为cmake中专用变量,分别表示宏或者函数参数中的特殊意义. ARGC AR ...
- argc, argv 到底是干啥用的?
文章目录 前言 分析 初探类型 文件IO 多个文件IO 自定义格式 总结 前言 在旧版本的IDE中新建一个C/C++源文件,你可能会看到这种样子的main函数 int main(int argc,ch ...
- argc,**argv
main函数的参数argc,argv用于 取得命令行参数 int main(int argc,char **argv) 或 int main(int argc, char *argv[]) argc是 ...
- 关于C++中的argc,argv的使用方法
想必很多人都好奇C++中的int argc 和 char **argv .那我们今天来看看argc,argv的使用方法 1,int argc argc 实际上指命令行接受的参数个数, 比如说,这个程序 ...
- main函数的参数-argc,argv介绍
在main函数的定义形式中,会涉及到argc,argv以及envp参数(参考上一篇:C程序main函数https://blog.csdn.net/m0_52892985/article/details ...
- 操作argc, argv的经典写法
[问题] 我在看boost源代码的时候看到如下的代码, template<class charT>basic_command_line_parser<charT>::basic ...
- argc,argv,argv[0]用法详解
http://www.site.uottawa.ca/~lucia/courses/2131-05/labs/Lab3/CommandLineArguments.html You'll notice ...
- c语言中命令行参数argc,argv[]详解
argc 是 argument count的缩写,表示传入main函数的参数个数: argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0 ...
- php argc argv,argc和argv怎么使用
argc即为argument count的缩写,表示传入main函数的参数个数: argv即为argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一 ...
最新文章
- SEO系列二:何为用户体验?如何做好用户体验?
- bzoj4033:[HAOI2015]树上染色
- Win10系统下面的TR1008解决方案
- eclipse中创建最简单的maven结构的项目
- 微博表情包大全,截止2022年5月
- 怎么检查计算机和打印机是否连接网络,检查电脑是否正确连接网络打印机
- winform c# chart控件添加边界值线条以及扩展性功能
- html悬浮音乐符号,简谱中常用的音乐记号
- It is a distutils installed project and thus we cannot accurately determine which files belong to
- C/C++和Lua混合编程
- 【Python】从堆糖爬取图片Demo
- 电脑不限时长的录屏软件分享
- {“errcode“:44001,“errmsg“:“empty media data, hint: [1655962096234893527769663], from ip: 222.72.xxx.
- 彻底解读剪不断理还乱的\r\n和\n, 以Windows和Linux为例
- php爬取房源,Python 爬虫 链家二手房(自行输入城市爬取)
- 基于中国航信Eterm开发
- 苹果6s能安装通讯测试软件么,iOS 13在iPhone 6S和SE上运行情况如何
- java程序员发展_超详细的Java程序员职业发展路径,值得深思!
- Android最实用的各种技能点的网址链接(每天都会更新,希望大家用的上)
- 【12个降维技术的终极指南(使用Python代码)】
热门文章
- 命运2服务器维护2021,《命运2》3.0.2版本更新内容详情 2021年1月20日更新公告
- 劳动法-入职网络营销师/sem必看的职场宝典
- 法学考生必看—外经贸法学专业在职研究生
- linux网络tcp检测网络断开
- 陈天桥的互联网世界观
- 职业教育计算机教材,职业教育精品实用教材·计算机应用基础
- java的until_Java LocalDateTime until()用法及代码示例
- python中until的用法_python之selenium随记(几种等待的用法)
- 电脑工程师外企求职记
- bzoj4976 宝石镶嵌