C计划main函数有两个参数。文章1一个通常被称为argc,它代表的命令行参数的个数。

这节是比较重要的,因为这节要是没弄明白之后的函数实现理解起来就很麻烦,linux环境的函数,是怎么实现的,都会困难很多甚至完全理解不了。
支持C语言的环境中,可以在程序开始执行时将命令行传递给程序。调用主函数main时:
第一个参数(argc,用于参数计数)的值表示运行程序时命令行中参数的数目。
第二杆参数(argv,用于参数向量)是一个指向字符中数组的指针,每个字符对应一个指针。通常用多级指针处理这些字符串。
也就是说第一个参数是统计参数有多少的,第二个参数是指针,其所指的位置是具体的参数。

在c/c++中,int main(int argc,char *argv[])的具体含义是什么?,argcargv

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

argv为指针的指针

argc为整数

char **argv or: char *argv[] or: char argv[][]

main()括号内是固定的写法。

下面给出一个例子来理解这两个参数的用法:

假设程序的名称为prog,

当只输入prog,则由操作系统传来的参数为:

argc=1,表示只有一程序名称。

argc只有一个元素,argv[0]指向输入的程序路径及名称:./prog

当输入prog para_1,有一个参数,则由操作系统传来的参数为:

argc=2,表示除了程序名外还有一个参数。

argv[0]指向输入的程序路径及名称。

argv[1]指向参数para_1字符串。

当输入prog para_1 para_2 有2个参数,则由操作系统传来的参数为:

argc=3,表示除了程序名外还有2个参数。

argv[0]指向输入的程序路径及名称。

argv[1]指向参数para_1字符串。

argv[2]指向参数para_2字符串。

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

char *argv[] : argv
是一个指针数组,他的元素个数是argc,存放的是指向每一个参数的指针,

他的第一个元素即argv[0]为编译生成的可执行文件名(包括路径eg:”F:\VC\Ex1\Debug\Ex1.exe”),从二个元素(argv[1])开始,是每一个参数
int argc
表示argv的大小,是实际参数个数+1,其中+1是因为argv[0]是编译后的可执行文件名

main()主函数

每一C 程序都必须有一main()函数, 可以根据自己的爱好把它放在程序的某
个地方。有些程序员把它放在最前面, 而另一些程序员把它放在最后面, 无论放

在哪个地方, 以下几点说明都是适合的。

  1. main() 参数

在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env。

* argc: 整数, 为传给main()的命令行参数个数。

* argv: 字符串数组。

在DOS 3.X 版本中, argv[0] 为程序运行的全路径名; 对DOS 3.0

以下的版本, argv[0]为空串(“”) 。

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

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

argv[argc]为NULL。

*env: 安符串数组。env[] 的每一个元素都包含ENVVAR=value形式的字符
串。其中ENVVAR为环境变量如PATH或87。value 为ENVVAR的对应值如C:\DOS, C:
\TURBOC(对于PATH) 或YES(对于87)。

Turbo C2.0启动时总是把这三个参数传递给main()函数,
可以在用户程序中说明(或不说明)它们, 如果说明了部分(或全部)参数,
它们就成为main()子程序 的局部变量。

请注意: 一旦想说明这些参数, 则必须按argc, argv, env 的顺序, 如以下
的例子:

main()

main(int argc)

main(int argc, char *argv[])

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

其中第二种情况是合法的, 但不常见, 因为在程序中很少有只用argc, 而不
用argv[]的情况。

以下提供一样例程序EXAMPLE.EXE, 演示如何在main()函数中使用三个参数:

  [cpp] view plain copy
/*program name EXAMPLE.EXE*/    
    #include   
    main(int argc, char *argv[], char *env[])   
    {   
         int i;   
         printf("These are the %d   command- line   arguments passed   to main:\n\n", argc);   
         for(i=0; i<=argc; i++)   
           printf("argv[%d]:%s\n", i, argv[i]);   
         printf("\nThe environment string(s)on this system are:\n\n");   
         for(i=0; env[i]!=NULL; i++)   
              printf(" env[%d]:%s\n", i, env[i]);   
    }     

如果在DOS 提示符下, 按以下方式运行EXAMPLE.EXE: 
 C:\example first_argument "argument with blanks"   3   4   "last   but one" stop! 
 注意: 可以用双引号括起内含空格的参数, 如本例中的:    "   argument with blanks"和"Last but one")。 
 结果是这样的: 
  The value of argc is 7 
  These are the 7 command-linearguments passed to main: 
  argv[0]:C:\TURBO\EXAMPLE.EXE 
  argv[1]:first_argument 
  argv[2]:argument with blanks 
  argv[3]:3 
  argv[4]:4 
  argv[5]:last but one 
  argv[6]:stop! 

命令行界面的程序,通常都需要输入命令行参数帮助程序执行。假定有一个可执行程序名为test。那么运行该程序的的命令行如下:

test

带命令行参数是同一行中的附加项:

test –c TEST

其中 –c 和
TEST就是命令行参数。C程序可以将这些附加参数读出来,并为自己所用,比如作为程序运行的条件(经常看到调试参数
–D
就是这么一个)。C程序通过使用main()的参数来读取这些附加参数,下面的repeat.c给出一个读出main参数的例子:

repeat.c: 
[cpp] view plain copy
#include    
int main(int argc, char *argv[])   
{   
int count;   
printf("The command line has %d arguments:\n", argc - 1);   
for(count = 1; count < argc; count++)   
{   
printf("%d: %s\n", count, argv[count]);   
}   
printf("\n");   
//system("PAUSE");   
return 0;   
}   

这里先解释一下main(int argc,
char*argv[])这个函数中两个参数的意义,argc记录的是命令行中输入参数的数目,argv是一个拥有argc个元素的字符串数组,每个元素
保存一个命令行中输入的参数。

编译这个文件为可执行文件repeat:

gcc repeat.c -o repeat

按下 列方式执行 repeat 程序

./repeat I “love you” 3

输出如下:

The command line has 3 arguments:

1: I

2: love you

3: 3

在这个例子中,argc的
值为4,命令行一共输入了四个参数“./repeat”、“I”、“love
you”、“3”。在DOS和UNIX环境下,命令行参数中用””符号表示其是一个字符串,视为一个参数。

main(int argc,char
*argv[])的具体含义是什么?,argcargv int main(int argc,char *
argv[]) argv为指针的指针 argc为整数 char **argv or: char
*argv…

第2个通常称为argv。它指向一组參数值。

C语言约定,argv[0]的值是启动该程序的程序名(就是说第一个参数就是这个程序的名称).因此argc的值至少是1.如果argc的值是1,那么就说明程序名后面没有参数.第一个可选的参数是argv[1],因为argv[0]是参数名,约定不可更改.最后一个可选参数是argv[argc

1].因为参数是从0开始计数的,所以需要总数减去1才是最后一个.另外ANSI标准要求argv[argc]就是最后一个参数后面必须是空指针0.
例子是将argv的元素除了程序名外(第0个元素)依次输出。后面那个(i <
argc – 1) ? ” ” : “”;的目的只是为了加个空格吧?

下面例子说难也没多难,一样的东西,但是这个指向char类型的指针的指针有点拗口。
必发娱乐官方网站,argv→argv[i]→char类型
把argv当成一个指针,它指向的元素也是一个指针,而这个指针又指向了char类型.
这里完全是因为数组和指针是差不多一样的,可以混用.所以才这样.

理解了上面的那些基础,之后这个例子就简单了.
开头一样还是带参数的.
然后就是那个line的指针数组,元素都是指向每个输入行的首字符的指针.
判断参数是不是等于2.等于2才是正确的参数数量,第一个是argc.
然后就是查找,先确定还存在未读取的行.
然后将argv1与line对比.如果当前行没有就返回NULL,如果有那么就继续.
将该行打印在屏幕上.
然后将计数变量加1.
返回包含参数字符的行数量.

UNIX系统中的C语言有一个公共的约定,以负号开头的参数表示一个可选标志或参数.
因为argv为指针数组,假设命令行参数为:eco hello world 所以:
1.++argv[0],[]优先级最高,所以先取argv[0]的值,argv[0]为字符串数组”ehco\0″的指针,然后指针自增++,再使用,即字符
c。
2.(++argv)[0],即先(argv+1)取出argv[1]中的值,argv[1]为字符串数组”hello\0″的指针,所以最后结果为字符
h。
两者截然不同。
指针数组作为函数参数时,函数将其作为指向指针的指针处理,因此可以自增
而自定义的指针数组实质还是数组,对数组名自增运算是非法的.
这是摘自网上的两段解释,非常清楚的解释了(++argv)[0]是想表达什么意思.
但是如果将之前的指针数组的元素都是字符串的首字符这点明确的话,这里应该也是比较好理解的.
因为上面那些原因所以可以对负号’-‘进行对比.
之后就是多路判定,判断参数.
想了一会为啥argc要等于1,书上给了解释,argc执行自减运算,argv自增,到最后如果格式正确,即参数正确都是-开头的情况下,到最后就是argc自减成1,变成只剩程序名一个,argc也走到了
参数后面需要查找的字符那里.
然后就是判断输出,不过加了一个lineno这个就是计数的没循环一次加1并打印.
然后又个exceot是判断是否输出当前行的,参数有x的话之前except就被赋值为1,否则就是0,
找到这样的行就是1,与except对比如果不是1就输出,如果是0就不输出.
然后判断number 这个就是加个序号.
之前那个(
++argv)[0]书上也有解释.可以看一下.

指针数组:这个数组的每一个元素都是一个字符指针,数组的末尾是一个NULL指针。

argc的值和这个NULL值都用于确定实际传递了多少个參数。argv指向数组的第1个元素。这就是它为什么被声明为一个指向字符的指针的指针的原因。注意:通常第1个參数就是程序的名称。

演示样例:

#include <stdio.h>  int main(int argc, char **argv) {  while(*++argv != NULL){   printf("%s ", *argv);   }  printf("\n");   return 0; }

上面的样例用于显示命令行的參数。

处理命令行參数演示样例:

#include <stdio.h>  int main(int argc, char **argv) {  while(*++argv != NULL && **argv == '-'){   switch(*++*argv){//检查横杠后面的字母   case 'a':    printf("option is a.\n");     break;   case 'b':    printf("option is b.\n");     break;   }   }  return 0; }

版权声明:本文博客原创文章,博客,未经同意,不得转载。


Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注