main(argc,argv)中参数含义_c语言int char

main(argc,argv)中参数含义_c语言int char这篇文章主要介绍了C语言中intmain(intargc,char*argv[])的两个参数详解的相关资料,需要的朋友可以参考下:转载自:https://www.jb51.net/article/107168.htm        https://www.cnblogs.com/ruixingw/p/3705918.htmlC语言中intmain(inta…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

这篇文章主要介绍了C语言中 int main(int argc,char *argv[])的两个参数详解的相关资料,需要的朋友可以参考下:

转载自:https://www.jb51.net/article/107168.htm

              https://www.cnblogs.com/ruixingw/p/3705918.html

C语言中 int main(int argc,char *argv[])的两个参数详解

argc是命令行总的参数个数;

argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数。命令行后面跟的用户输入的参数。

int  main(int  argc,  char*  argv[]) 
  { 
  int  i; 
  for  (i  =  0;  i<argc;  i++) 
  cout<<argv[i]<<endl; 
  cin>>i; 
  return  0; 
  } 

Jetbrains全家桶1年46,售后保障稳定

   执行时敲入    

 F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE  aaaa  bbb  ccc  ddd 

   输出如下:    

 F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE 
  aaaa 
  bbb 
  ccc 
  ddd 

——————————————————————–

char   *argv[]是一个字符数组,其大小是int   argc,主要用于命令行参数   argv[]   参数,数组里每个元素代表一个参数;

比如你输入  

 test  a.c  b.c  t.c 
  则 
  argc  =  4 
  
  argv[0]  =  "test" 
  argv[1]  =  "a.c" 
  argv[2]  =  "b.c" 
  argv[3]  =  "t.c"

——————————————————————————————–  

argc记录了用户在运行程序的命令行中输入的参数的个数。  

arg[]指向的数组中至少有一个字符指针,即arg[0].他通常指向程序中的可执行文件的文件名。在有些版本的编译器中还包括程序
文件所在的路径。

int main(int argc, char ** argv)
{
 int i;
  for (i=0; i < argc; i++)
    printf("Argument %d is %s.\n", i, argv[i]);

  return 0;
}

在OpenCV的编程中经常使用上述main函数的使用方式,

其中argc代表:输入的参数个数    

其中argv代表:此可执行文件的存储路径、程序变量 

  例如:你在D盘下建立了一个工程,并命名为cvshow,同时在此工程下建立了一个名为cvshow的cpp源文件,当执行程序是将在Debug文件夹下生成show.exe可执行文件,当然Debug文件位于工程cvshow下,所以可执行文件show.exe的存储路径为

D:\cvshow\Debug\show.exe,即argv[0]的值

  argv[1]、argv[2]、argv[3]一次代表输入变量,变量以空格相隔开

 实例:

    加入输入变量为:c:\baboon.jpg 

    那么,argc==1  argv[0]==D:\cvshow\Debug\show.exe   argv[1]==c:\baboon.jpg

——————————————————————————————-

在调用一个可执行程序时,某些情况下需要向程序传递参数。如我们可以在控制台中键入notepad.exe,回车后将执行记事本程序。如果我们希望在打开notepad时同时打开一个文本文件,可以在notepad.exe  后面跟上文件的路径和名字,如notepad.exe   example.txt(文件在当前路径)。   

那么程序中如何能得到这些输入参数呢?这个工作是编译器帮我们完成的,编译器将输入参数的信息放入main函数的参数列表中。   

main函数的参数列表保存了输入参数的信息,第一个参数argc记录了输入参数的个数, 第二个参数是字符串数组的,字符串数组的每个单元是char*类型的,指向一个c风格字符串。   

以notepad.exe   example.txt为例 ,argc是2,就是说argv数组中有两个有效单元 ,第一单元指向的字符串是”notepad.exe”,第二单元指向的字符串是”example.txt”   

argv数组中的第一个单元指向的字符串总是可执行程序的名字,以后的单元指向的字符串依次是程序调用时的参数。   

这个赋值过程是编译器完成的,我们只需要读出数据就可以了。

———————————————————————————————

int  main(  int   argc  ,  char   *argv[]  , char   *envp[]  )   

main()函数一般用int或者void形的。我比较喜欢用int型定义main。因为在结束的时候可以返回给操作系统一个值以表示执行情况。   

int   argc   
这个东东用来表示你在命令行下输入命令的时候,一共有多少个参数。比方说你的程序编译后,可执行文件是test.exe   
D:\tc2>test   
这个时候,argc的值是1   
但是   
D:\tc2>test.exe   myarg1   myarg2   
的话,argc的值是3。也就是   命令名   加上两个参数,一共三个参数   

char   *argv[]   
这个东东用来取得你所输入的参数   
D:\tc2>test   
这个时候,argc的值是1,argv[0]的值是   “test”   
D:\tc2>test   myarg1   myarg2   
这个时候,argc的值是3,argc[0]的值是”test”,argc[1]的值是”myarg1″,argc[2]的值是”myarg2″。   
这个东东一般用来为程序提供非常重要的信息,如:数据文件名,等等。   
如:copy   a.c   b.txt   
这个时候,a.c和b.txt就是所谓的“非常重要的信息”。不指定这两个文件,你没法进行拷贝。   
当你的程序用到argc和argv这两个参数的时候,可以简单地通过判断argc的值,来看看程序的参数是否符合要求   

char   *envp[]   
这个东东相对来说用得比较少。它是用来取得系统的环境变量的。   
如:在DOS下,有一个PATH变量。当你在DOS提示符下输入一个命令(当然,这个命令不是dir一类的内部命令)的时候,DOS会首先在当前目录下找 这个命令的执行文件。如果找不到,则到PATH定义的路径下去找,找到则执行,找不到返回Bad   command   or   file   name   
在DOS命令提示符下键入set可查看系统的环境变量   
同样,在UNIX或者LINUX下,也有系统环境变量,而且用得比DOS要多。如常用的$PATH,$USER,$HOME等等。   
envp保存所有的环境变量。其格式为(UNIX下)   
PATH=/usr/bin;/local/bin;   
HOME=/home/shuui   
即:   
环境变量名=值   
DOS下大概也一样。   
环境变量一般用来为程序提供附加信息。如,你做了一个显示文本的内容的程序。你想控制其一行中显示的字符的个数。你可以自己定义一个环境变量(UNIX下)   
%setenv   NUMBER   =   10   
%echo   $NUMBER   
10   
然后你可以在程序中读入这个环境变量。然后根据其值决定一行输出多少个字符。这样,如果你不修改环境变量的话,你每次执行这个程序,一行中显示的字符数都是不一样的   
下面是一个例子程序   

/* argtest.c */   
#include<stdio.h>   
int main(   int   argc   ,   char   *argv[]   ,   char   *envp[]   )   
{   
int   i;   

printf(   "You   have   inputed   total   %d   argments\n"   ,   argc   );   
for(   i=0   ;   i<argc   ;   i++)   
{   
printf(   "arg%d   :   %s\n"   ,   i   ,   argv[i]   );   
}   

printf(   "The   follow   is   envp   :\n"   );   
for(   i=0   ;   *envp[i]!='\0'   ;   i++   )   
{   
printf(   "%s\n"   ,   envp[i]   );   
}   
return   0;   
}   


D:\>argtest   this   is   a   test   programe   of   main()'s   argments   
You   have   inputed   total   9   argments   
arg0   :   D:\TC\NONAME.EXE   
arg1   :   this   
arg2   :   is   
arg3   :   a   
arg4   :   test   
arg5   :   programe   
arg6   :   of   
arg7   :   main()'s   
arg8   :   argments   
The   follow   is   envp   :   
TMP=C:\WINDOWS\TEMP   
TEMP=C:\WINDOWS\TEMP   
PROMPT=$p$g   
winbootdir=C:\WINDOWS   
PATH=C:\WINDOWS;C:\WINDOWS\COMMAND   
COMSPEC=C:\WINDOWS\COMMAND.COM   
SBPCI=C:\SBPCI   
windir=C:\WINDOWS   
BLASTER=A220   I7   D1   H7   P330   T6   
CMDLINE=noname   this   is   a   test   programe   of   main()'s   argments     

—————————————————————————————–
命令行参数啊。argc   是参数的个数,argv[]是参数,argv[0]是文件名,argv[1]是第一个参数…   
如你得exe文件名是:myprog.exe,那么   
myprog   12   22   32   
则argv[0]=”myprog”,argv[1]=”12″,argv[2]=”22″…   

exit()是程序退出时的返回码。可以用其他程序接收,判断是否正常退出。如exit(-1)认为异常退出。
———————————————————————————————

请问这里为什么要设置这两个参数呢?不要不行吗?谢谢
有些时候程序运行时需要提供一些参数。比如copy命令,需要指明源文件和目标文件名,就得通过argc和argv来传递。
1、int main(int argc,char *argv)与int main(int argc,char **argv)区别?

    int main(int argc,char *argv)

  argc: 整数,用来统计你运行程序时送给的命令行参数的个数

  * argv: 字符串,用来存放指向你的字符串参数的,每一个元素指向一个参数

  argv[0] 指向程序运行的全路径名

  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串

  argv[2] 指向执行程序名后的第二个字符串

 

    int main(int argc,char **argv) 相当于  int main(int argc,char *argv[ ] )

     argc: 整数,用来统计你运行程序时送给的命令行参数的个数

  * argv: 字符串,用来存放指向你的字符串参数的,每一个元素指向一个参数

  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串的指针

  argv[2] 指向执行程序名后的第二个字符串的指针

      在int main(int argc,char **argv)中 argv[1]是一个指针,存的内容是一个地址,而在int main(int argc,char

       *argv)中argv[1]是一个数组元素(个人理解)

 我们经常用的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:  

main (argc,argv)
int argv;
char *argv[];或写成:
main (int argc,char *argv[])

  由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢? 实际上,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。

  DOS提示符下命令行的一般形式为: C:\>可执行文件名 参数 参数……; 但是应该特别注意的是,main 的两个形参和命令行中的参数在位置上不是一一对应的。因为,main的形参只有二个,而命令行中的参数个数原则上未加限制。argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。例如有命令行为: C:\>E6 24 BASIC dbase FORTRAN由于文件名E6 24本身也算一个参数,所以共有4个参数,因此argc取得的值为4。argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数。数组元素初值由系统自动赋予。其表示如图6.8所示:

main(int argc,char *argv){
while(argc-->1)
printf("%s\n",*++argv);
}

本例是显示命令行中输入的参数如果上例的可执行文件名为e24.exe,存放在A驱动器的盘内。
因此输入的命令行为: C:\>a:e24 BASIC dBASE FORTRAN  
则运行结果为:
BASIC
dBASE
FORTRAN
  该行共有4个参数,执行main时,argc的初值即为4。argv的4个元素分为4个字符串的首地址。执行while语句,每循环一次 argv值减1,当argv等于1时停止循环,共循环三次, 因此共可输出三个参数。在printf函数中,由于打印项*++argv是先加1再打印, 故第一次打印的是argv[1]所指的字符串BASIC。第二、 三次循环分别打印后二个字符串。而参数e24是文件名,不必输出。

  下例的命令行中有两个参数,第二个参数20即为输入的n值。在程序中*++argv的值为字符串“20”,然后用函数”atoi”把它换为整型作为while语句中的循环控制变量,输出20个偶数。

#include"stdlib.h"
main(int argc,char*argv[]){
int a=0,n;
n=atoi(*++argv);
while(n--) printf("%d ",a++*2);
}

  本程序是从0开始输出n个偶数。指向指针的指针变量如果一个指针变量存放的又是另一个指针变量的地址, 则称这个指针变量为指向指针的指针变量。

  在前面已经介绍过,通过指针访问变量称为间接访问, 简称间访。由于指针变量直接指向变量,所以称为单级间访。 而如果通过指向指针的指针变量来访问变量则构成了二级或多级间访。在C语言程序中,对间访的级数并未明确限制, 但是间访级数太多时不容易理解解,也容易出错,因此,一般很少超过二级间访。 指向指针的指针变量说明的一般形式为:  
类型说明符** 指针变量名;  
例如: int ** pp; 表示pp是一个指针变量,它指向另一个指针变量, 而这个指针变量指向一个整型量。下面举一个例子来说明这种关系。

main(){
int x,*p,**pp;
x=10;
p=&x;
pp=&p;
printf("x=%d\n",**pp);
}  

  上例程序中p 是一个指针变量,指向整型量x;pp也是一个指针变量, 它指向指针变量p。通过pp变量访问x的写法是**pp。程序最后输出x的值为10。通过上例,读者可以学习指向指针的指针变量的说明和使用方法。

  下述程序中首先定义说明了指针数组ps并作了初始化赋值。 又说明了pps是一个指向指针的指针变量。在5次循环中, pps 分别取得了ps[0],ps[1],ps[2],ps[3],ps[4]的地址值(如图6.10所示)。再通过这些地址即可找到该字符串。

main(){
static char *ps[]={ "BASIC","DBASE","C","FORTRAN",
"PASCAL"};
char **pps;
int i;
for(i=0;i<5;i++){
pps=ps+i;
printf("%s\n",*pps);
}
}

本程序是用指向指针的指针变量编程,输出多个字符串。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234428.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 手把手教你学DSP 28335学习笔记「建议收藏」

    手把手教你学DSP 28335学习笔记「建议收藏」本文转载连接:https://blog.csdn.net/nvh12138/article/details/79970985DSPF28335学习笔记1.GPIOGPxMUX(功能选择寄存器),GPxMUX.bit=0配置为I/O功能。GPxMUX.bit=1配置为外设功能。复位时所有GPIO配置为I/O功能。GPxDIR(方向选择寄存器),0为输入,1为…

  • hive基础总结(面试常用)

    hive基础总结(面试常用)

  • 涂鸦模组开发光照传感器的作用_光学模组

    涂鸦模组开发光照传感器的作用_光学模组涂鸦模组开发光照传感器(OPT3006)概述涂鸦智能系统框架设计OPT3006超薄环境光传感器TYZS5模组特点PCB绘制涂鸦零代码开发涂鸦模组开发文章概述亮度传感器是一种常用的智能检测设备,主要利用亮度集成传感器,实时检测环境明暗的亮度数据。它不仅仅适用于智能家居体系,同样被广泛应用于场景中,例如办公楼、酒店、公寓、学校、医院、养老院、商场、餐厅、银行、仓库、街道等。根据外界环境光线的明暗,实现与其它智能设备的联动;还可通过设定延时功能,避免光线瞬间变化造成干扰。在此,分析并选取合适的平台、传

  • 电商仓库erp软件_电商交易系统和订单系统

    电商仓库erp软件_电商交易系统和订单系统1、系统独立部署、永久使用,自行管理绑定和授权店铺账号,所有数据都保存在自己的数据库中,多账号使用不关联。2、支持前端的自定义开发和后端功能定制。3、零售、分销、批发、营销方式全面支持,支持兰亭、DX等批量发货、定期对账结算。4、ERP、商品、库存、订单、list售价、list库存实时同步。5、灵活的商品注册:支持多款式、组合品、商品图片6、将从平台下载的订单自动快速导入、自动派单、分配库存。7、具备每天300…

  • phpstudy2016安装redis扩展

    phpstudy2016安装redis扩展

    2021年10月16日
  • MySQL详解--锁

    MySQL详解--锁锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号