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]!='
/* 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     
' ; 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)


相关推荐

  • MIT 操作系统实验 MIT JOS lab2

    MIT 操作系统实验 MIT JOS lab2

  • 程序员为什么不喜欢去做外包_外包程序员的出路

    程序员为什么不喜欢去做外包_外包程序员的出路做IT的一定对于外包公司很熟悉,就算没做过,想必也是经常听说,说实话在行业内是存在鄙视链的,而外包公司往往在最低端。很多人都在四处问:“软件外包公司到底能不能去”?到底能不能学到真正的技术?我来为大家详细梳理一下这个问题。想要知道外包公司到底值不值得去,我们就应该了解外包公司的概念是什么?不仅仅是IT行业有软件外包公司,在很多行业中,外包公司的数量也都是最多的。外包的工作形式分为两种:‍外包公司承接甲方的项目,了解需求后拿回自己的公司做项目,程序员按照客户的需求把代码写好,最终完成项目,外包

  • pycharm一键调整代码格式_pycharm community怎么改成中文

    pycharm一键调整代码格式_pycharm community怎么改成中文用pycharm真的很久了,一直是英文的IDE,还是感到不太方便。在网上找如何将pycharm汉化,结果搜出来的结果都是下载补丁?或者是激活成功教程版?风险很大。于是自己摸索出了这个官方汉化版的操作,绝对安全,绝对简便!!打开settings(设置),然后在里面搜索plugins(插件)。 进入界面之后,点击中上方的marketplace(市场),搜索”chinese”。 弹出来的第一个,作者是JetBrains官方出的插件,点击安装。 重启之后,界面就变成下图的汉化版了!!超级方便,超级安全!!

  • DoJa平台手机游戏的开发与移植

    DoJa平台手机游戏的开发与移植作者:关文柏时间:2006年6月13日关键字:DoJaNTTDoCoMoi-modei-appli内容概况:·DoJa技术简介·DoJaAPI预览·appli程序的开发·DoJa游戏移植到J2ME平台的方法·相关资源链接一,DoJa技术简介简单的说,DoJa是日本最大的移动通讯公司NTTDoCoMo…

  • JWT — JWT原理解析及实际使用[通俗易懂]

    JWT — JWT原理解析及实际使用[通俗易懂]一、JWT1、JWT介绍JWT(jsonwebtoken)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用户登录。在传统的用户登录认证中,因为http是无状态的,所以都是采用session方式。用户登录成功,服务端会保存一个session,服务端会返回给客户端一个sessionId,客户端会把sessionId保存在cookie中,每次请求都会携带这个sessionId。

    2022年10月17日
  • landsat8与sentinel2波段对比

    landsat8与sentinel2波段对比landsat8与sentinel2波段对比Landsat8波段对比哨兵2号,通常Landsat8OLI使用7、5、2或7、5、3,哨兵2号相对应的为12、8、2。Landsat7ETM+通常采用7、4、1。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计,将会带来全新…

发表回复

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

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