命令行参数(argc, argv)
每个C语言程序都必须有一个称为main()的函数,作为程序启动的起点。当执行程序时,命令行参数(command-line argument)(由shell逐一解析)通过两个入参提供给main()函数。第一个参数int argc,表示命令行参数的个数。第二个参数char *argv[],是一个指向命令行参数的指针数组,每一参数又都是以空字符(null) 结尾的字符串。第一个字符串,亦即argv[0]指向的,(通常)是该程序的名称。argv中的指针列表以NULL指针结尾(即argv[argc]为NULL)。
argv[0]包含了调用程序的名称,可以利用这一特性玩个实用的小技巧。首先为同一程序创建多个链接(即名称不同),然后让该程序查看argv[0],并根据调用程序的名称来执行不同任务。gzip(1)、gunzip(1)和zcat(1)命令是该技术应用的一个例子,这些命令链接的都是同一可执行文件。(使用该技术,必须小心处理如下情况:用户通过链接调用程序,但链接名又在该程序的意料之外。)
图6-4展示了执行程序清单6-2中程序所传入参argc和argv的数据结构。该图使用C语言符号"\0"来表示每个字符串末尾的终止空字节。
程序清单6-2中的程序回显了其命令行参数,逐一按行输出,前面还冠以要显示的argv成员名称。

程序清单6-2:回显命令行参数

因为argv列表以NULL值终止,所以可以将程序清单6-2中的程序主体改写如下,且每行只输出一个命令行实参:

argc/argv参数机制的局限之一在于这些变量仅对main()函数可用。在保证可移植性的同时,为使这些命令行参数能为其他函数所用,必须把argv以参数形式传递给这些函数,或是设置一个指向argv的全局变量。
要想从程序内任一位置访问这些信息的部分或者全部内容,还有两个方法,但是会破坏程序的可移植性。
通过linux系统专有的/proc/PID/cmdline 文件可以读取任一进程的命令行参数,每个参数都以空(null)字节终止。(程序可以通过/proc/self/cmdline文件访问自己的命令行参数。)
GNU C语言库提供有两个全局变量,可在程序内任一位置使用以获取调用该程序时的程序名称(即命令行的第一个参数)。第一个全局变量program_invocation_ name,提供了用于调用该程序的完整路径名。第二个全局变量program_invocation_ short_name,提供了不含目录的程序名称,即路径名的基本名称(basename)部分,定义_GNU_SOURCE宏后即可从<errno.h>中获得对这两个全局变量的声明。
正如图6-1所示,argv和environ数组,以及这些参数最初指向的字符串,都驻留在进程栈之上的一个单一、连续的内存区域。(下一节将描述environ参数,该参数用于存储程序的环境列表。)此区域可存储的字节数有上限要求,SUSv3规定使用ARG_MAX常量(定义于<limits.h>)或者调用sysconf(_SC_ARG_MAX)函数以确定该上限值(将在11.2节描述sysconf()函数),并且SUSv3还要求ARG_MAX常量的下限为_POSIX_ARG_MAX(4096)个字节,而大多数UNIX实现的限制都远高于此。但SUSv3并未规定对ARG_MAX限制的实现中是否要将一些开销字节计算在内(比如终止空字符、字节对齐、argv和environ指针数组)。
Linux中的ARG_MAX参数值曾一度固定为32个页面(在Linux/x86-32中即为131072个字节),且包含了开销字节。自内核2.6.23版本开始,可以通过资源限制RLIMIT_STACK来控制argv和environ参数所使用的空间总量上限,在这种情况下,允许argv和environ参数使用的空间上限要比以前大出许多,具体限额为资源软限制RLIMIT_ STACK的四分之一,RLIMIT_STACK在调用execve()时已经生效。更多详细信息请参照execve(2)手册页。
许多程序(包括本书中的几个例子)使用getopt()库函数解析命令行选项(即以"-"符号开头的参数)。附录(Appendix)B将描述getopt()函数。
______________________________________________________________________________________________________________________________________________
VS2008中设置main函数的argv[1]
1.main 函数输入参数argc argv
 main函数的完全格式是这样的: 
int   main(int   argc,   char*   argv[],   char*   envp[]) 
下面详细介绍: 
argc是执行程序时的命令行参数个数。需要注意的是,程序本身的文件也算一个。比如你写了个程序叫ex,若用下面的命令行启动: 
ex   /p   /w 
则argc的值为3。 
argv是命令行中参数的具体值。比如上例,则有 
argv[0]为 "ex " 
argv[1]为 "/p " 
argv[2]为 "/w " 
其实,dos时代的命令行参数就是这样处理的。 
最后一个envp是环境变量。 
比如path=c:\windows之类的东西。它没有一个整数来为它记数,是通过最后一个evnp[i]==NULL来表示结尾的。
argv[]中值是根据空格来判断的,所以用户输入的一个字符串中间不能有空格,否则会被认为是两个参数
2.vs2008 执行包含以上形式的main函数,输入参数设置
右键Properties->Debugging->Command Arguments
3.cmd 常用命令
进入某盘符     d:
进入目录    cd fouder
到上级目录   cd..   
显示当前目录   cd  
执行某程序   path\test.exe
命令行参数(argc, argv)的更多相关文章
- c语言中命令行参数argc,argv[]详解
		
main(int argc,char *argv[ ]) 1.argc为整数 2.argv为指针的指针(可理解为:char **argv or: char *argv[] or: char argv[ ...
 - Perl的命令行参数和ARGV
		
程序名:$0 $0表示当前正在运行的Perl脚本名.有3种情况: 如果执行方式为perl x.pl,则$0的值为x.pl而非perl命令本身 如果执行方式为./x.pl,则$0的值为./x.pl 如果 ...
 - Python命令行参数sys.argv[]
		
学习C语言的时候就没弄明白命令行参数的用法,在学习Pyton 的时候又遇到了命令行参数,在这里稍微学习了一下,稍微明白了一些在这里做个记录方便后面回顾复习. Sys.argv[]是用来获取命令行参数的 ...
 - C语言/Linux命令行参数argc、argv[ ]详解
		
1.void main(int argc,char *argv[]) argv[]:表示的是一个指针数组,一共有argc个元素,其中存放的是指向每一个参数的指针. argc:参数个数 2.以Linux ...
 - 传递命令行参数示例代码 (C 和 Python)
		
C语言 在 C 语言中, 使用 main 函数的输入参数 argc 和 argv 传入命令行参数. argc 为 int 类型, 表示传入命令行参数的个数 (argument count); argv ...
 - c语言命令行参数
		
int main(int argc, char * argv[]) { ..... } argc: 代表启动程序时,命令行参数的个数.C和C++语言规定,可执行程序程序本身的文件名,也算是一个命令行参 ...
 - 关于C语言命令行参数问题
		
1 int main(int argc,char** argv) 参数: argc:命令行参数的个数 argv:保存命令行参数:argv[0]保存本程序自己的名称 现在自己只知道这些以后再有学习继续补 ...
 - C++main函数与命令行参数,退出程序
		
本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=vs-2019 (除动态链接库d ...
 - Python命令行参数及文件读出写入
		
看完了柯老板的个人编程作业,虽然是评测组不用做此次作业,但还是想对本次作业涉及到利用Python命令行参数以及进行文件读出写入操作做一个简单的总结.(个人编程作业还是想自己能敲一敲,毕竟我的码力还是小 ...
 
随机推荐
- OC数组排序
			
NSArray *array = @[@"tailong", @"kaersasi", @"airuiliya", @"yingl ...
 - iOS开发笔记11:表单键盘遮挡、浮点数价格格式化显示、省市区选择器、View Debugging
			
1.表单键盘遮挡 应用场景为一个collectionView上有多个textfield.textView供用户填写信息. 之前输入项较少时,采取的方法比较粗暴,didSelectItemAtIndex ...
 - 关于tableView中tableHeaderView/tableFooterView/sectionHeader/sectionFooter/contentInset的理解
			
其实每个人的理解有所不同,找到最有利于自己的理解方式即可.有人把Cell,tableHeaderView,tableFooterView,sectionHeader,sectionFooter这些属性 ...
 - IOS开发之功能模块--自定义导航控制器类常用自定义的代码
			
前言:本文篇幅不多,但是涉及到的内容却是开发中常用的. 涉及的内容: 1.统一设置导航控制器子控制器的返回按钮. 2.因为修改了系统的返回按钮,所以还需要设置手势事件. 3.隐藏底部的工具条. 这里直 ...
 - paas架构之docker——容器进程管理
			
1.docker进程管理 docker的进程管理命令ps的用法基本和ubuntu系统的用法一致 1.1. 查看docker进程 sudo docker ps –a 1.2. 附着到容器上 Sudo d ...
 - Outlook 2013 在邮件里面点击超链接时弹出“组织策略阻止我们为您完成此操作”
			
现象描叙: 在Outlook在邮件里面点击超链接时,打不开超链接页面,弹出如下提示: 这个是因为之前安装了其它浏览器(例如,我安装了360的浏览器),并且设置为了默认浏览器,后来卸载了该浏览器 ...
 - MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程
			
虽然MySQL的存储过程,一般情况下,是不会使用到的,但是在一些特殊场景中,还是有需求的.最近遇到一个sql server向mysql迁移的项目,有一些sql server的存储过程需要向mysql迁 ...
 - SQL Server 2008 R2——VC++ ADO 操作 存储过程
			
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
 - [部署]CentOS yum源
			
安装yum源 一般的软件都会提供一个.rpm的软件包,使用rpm指令安装了这个包后会自动添加一个yum仓库源,之后用yum就可以安装该软件了. 安装rpm包 rpm -ivh http://repo. ...
 - Kafka原理与java simple producer示例
			
brokers和消费者使用zk来获取状态信息和追踪消息坐标. 每一个partition是一个有序的,不可变的消息序列. 只有当partition里面的file置换到磁盘文件以后,才开放给消费者来消费. ...