C语言中的main函数参数列表解析(命令行参数)

前几天我们已经聊过了函数的调用过程,其中我们提到了,main函数也是被其他函数调用的。既然main函数也是被调用的,那么它就一定可以传参,那么它的参数列表到底是什么样子呢?
我们先来看一小段代码:

#include<stdio.h>

int main(int argc,char *argv[],char *envp[])
{
    int i = 0;
    for(;i<argc;i++)
    {
        printf("%d -> %s\n",i,argv[i]);
    }
    printf("%d\n",argc);
    return 0;
}

它的运行结果是这个样子的:
命令行参数

因为命令行参数在Linux系统下的应用非常广泛,所以我这里采用的编译环境是在Linux操作系统下的gcc编译器,从代码和运行结果我们可以看出argc其实是代表了参数个数,argv[i]是指向了第i个字符串,在这里我们没有对envp做过多的演示,因为envp这个参数是对环境变量的一些配置,我们平时在编写程序的时候,用到的比较少,如果有兴趣,推荐大家看看《程序员的自我修养》这本书,其中对程序的编译、链接和装载有很深刻的讲解。

其中argv[]数组中存着一个个指针,它们在内存中的存储方式如下:
这里写图片描述

我们已经知道了argv中存着一个个是字符指针,它指向一个个的字符串,那么这样做有什么好处呢?它能给我们的程序带来什么优势呢?

这样写,可以使程序拥有更多的选项,我们可以给程序中添加多个功能,然后通过命令行参数来选择我们具体要使用哪一个功能。

比如下面这段代码,就可以通过不同的选项来实现加减乘除这个简单的计算功能。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void Add(int a,int b)
{
        printf("%d\n",a+b);
}

void Mul(int a,int b)
{
        printf("%d\n",a*b);
}

void Sub(int a,int b)
{
        printf("%d\n",a-b);
}

void Div(int a,int b)
{
        printf("%d\n",a/b);
}

int main(int argc,char *argv[],char *envp[])
{
    int a = atoi(argv[2]);
    int b = atoi(atgv[3]);
    if(strcmp("-a",argv[1]) == 0)
    {
        Add(a,b);
    }
    else if(strcmp("-s",argv[1]) == 0)
    {
        Sub(a,b)
    }
    else if(strcmp("-m",argv[1]) == 0)
    {
        Mul(a,b)
    }
    else if(strcmp("-d",argv[1]) == 0)
    {
        Div(a,b)
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zym1348010959/article/details/79637925