【浅谈】main函数的三个参数

【浅谈】main函数的参数

  
  我们平时使用main函数时,在main函数参数这一栏常常省略不写,或者填上(void)。那么今天我们来看看main函数的参数。

main函数的参数有哪些?

  在我们写好一个main函数框架后按F10开始单步调试,一直调试到走出main函数大括号外。这时我们能够看到如下代码:
  这里写图片描述
  我们可以很清晰的看到main函数时有参数的,而且是三个参数,并且在main函数被调用时是有这三个参数被传入的,但是我们日常并没有使用过。
  下面我将三个参数的定义写出:

    int main (int argc, char *argv[], char *envp[])
    {
        return 0;
    }

  要搞懂这几个参数的实际意义,我们需要在VS编译器下,右击工程名,选择属性选项,在配置属性栏下选择子选项:<调试> , 在右边栏命令参数一栏添加一些字符,并以空格将它们一一隔开。
这里写图片描述
  我们回到main函数代码块,写下如下代码并调试运行看看结果:

    int main(int argc, char *argv[], char *envp[])
    {
        int i = 0;

        for (i = 0; i < argc; i++)
        {
            printf("%s\n", argv[i]);
        }

        return 0;
    }

这里写图片描述
  事实上,在结果中我们第一行显示的是我们编译的C文件的路径,而下面则是我们刚才在命令参数那栏写下的一些以空格隔开的字符。
  如果大家有接触过linux命令行的话,应该有见到过或者使用过如下的代码:

    ls -l       <linux> //这是列出当前目录下所有文件的详细参数

  这里的 -l 就是我们所说的命令行参数。
  我们刚才在给调试右边栏命令参数栏中填写的以空格隔开的字符就是在给参数命名,后面我们会将它的具体用法。
  那么由此我们可以分析出,我们在刚才main函数那个for循环中控制终止条件的argc就是我们的命令参数的个数。
  而在printf(”%s\n”, argv[i])中argv[]这个数组,通过main函数的定义我们知道它是一个存放char*类型的指针数组。那么这里它应该就是存放的我们刚才输入的四个字符串的首地址。
  这里写图片描述
  事实上argv[]中最后一个元素恒存放一个空指针,作为argv数组的结束标志
  
  我们在windows命令行指令中(cmd)也能添加类似的命令行参数。按下电脑的win + R键调出运行窗口,在输入栏输入cmd然后回车,出现黑色窗口,这就是我们的终端窗口:
  这里写图片描述
  紧接着在黑框中输入存放调试文件目录的那个磁盘的卷名。
  再使用cd命令将当前的路径转到存放我们当前调试的文件的DEBUG文件目录下,再使用dir命令列出当前目录下的文件(与Linux中ls命令相似):
  这里写图片描述
  我们再输入.exe后缀的文件名后面加上一些字符,按回车运行之(即在cmd下执行刚才的调试程序,最终效果与刚才的程序效果相同):
  这里写图片描述
  小伙伴们有没有发现,这和在编译器下运行的情况很相似,唯一的不同是我们在cmd窗口手动添加了几个字符。
  那么我们不妨展开联想,是否可以将这个特性运用到实际中去……

main函数参数有什么作用呢?

  
  大家见识了main函数的前两个参数后,一定会有一个疑问,那就是命令行的参数到底怎么用?其实,在我们日常生活中常出现的计算器,就可以用main函数参数来简单实现。那么下面我就用main函数前两个参数来实现一下计算器这个小程序:
  假设我们想进行加法运算,那么肯定需要让电脑知道我们要进行加法运算,所以”add”这个命令参数必不可少,然后还有参与加法的两个操作数,只要有了这几个参数,我们就可以让电脑进行运算了。那么前提条件我们已经准备好了,下面我给大家来分步讲解一下实现方法。
  我们知道刚刚在main函数中写出的小程序的作用是输出argv[]数组中的各个元素,那么我们就可以得知,argc是记录我们刚才输出参数的个数的(因为argc在控制for循环的循环次数)。我们输入的那些参数全部被存放在argv[]这个数组当中,如果我们在输入参数后在读取argv[]数组是否可以做一个简单的计算器呢?
  这里我简单实现一个加法的小运算指令:

enum calc
{
    ADD = 'a',
    SUB = 's',
    MUL = 'm',
    DIV = 'd'
};

int Add(int a, int b)
{
    return a + b;
}

int Sub(int a, int b)
{
    return a + b;
}

int Div(int a, int b)
{
    return a / b;
}

int Mul(int a, int b)
{
    return a * b;
}

int main(int argc, char *argv[], char *envp[])
{
    int a = atoi(argv[2]);
    int b = atoi(argv[3]);
    int ret = 0;

    if (argc != 4)
    {
        printf("请检查参数个数\n");
        return -1;
    }

    switch (*(argv[1]+1))
    {
    case ADD: ret = Add(a, b);
        break;
    case SUB: ret = Sub(a, b);
        break;
    case MUL: ret = Mul(a, b);
        break;
    case DIV: ret = Div(a, b);
        break;
    default: printf("参数有问题\n");
        return -1;
    }
    printf("%d\n", ret);

    return 0;
}

  这里我的思路是先判断argc的大小也就是用户输入参数个数是否是规定的大小。
  再将用户输入的第2,3个参数进行字符到数字的转换。
  最后我们使用switch判断语句判断用户想要进行的操作指令,这里我的事件标签使用枚举的方法是代码更具可读性。枚举类型的定义在最上面。

  看到这,我们是不是对main函数的参数有了一定的了解。

envp[]环境参数

  最后我们简单介绍一下第三个参数,envp[],这个数组与刚才的argv[]有些相似,它的最后一个元素也储存的空指针。接下来大家将envp[]数组中的元素打印出来:

int main(int argc, char *argv[], char *envp[])
{
    int i = 0;
    while (envp[i] != NULL)
    {
        printf("%s\n", envp[i]);
        i++;
    }

    return 0;
}

  这里写图片描述
  我们可以看到,这些字符串很复杂,不过这些就是我们的环境变量了,那么环境变量的作用我简单描述一下,其实就是搭建我们一个程序的工作环境,让它可以在一定的环境下进行工作。至于详细的作用,这里我就不多做介绍了。大家在以后的学习中肯定能够更深入的了解它的作用。

全文完,感谢浏览

猜你喜欢

转载自blog.csdn.net/qq_41866437/article/details/80240810