学习C这么久了,main函数的这三个参数你见过吗?

这篇具有很好参考价值的文章主要介绍了学习C这么久了,main函数的这三个参数你见过吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习C这么久了,main函数的这三个参数你见过吗?

💐专栏导读

🌸作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 Linux从入门到精通,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

🌸相关专栏推荐:C语言初阶系列C语言进阶系列C++系列数据结构与算法

💐文章导读

你知道main函数有几个参数呢?你使用过它们吗?本章我们就一起来认识一下main函数的几个不常见但是作用很大的参数~

学习C这么久了,main函数的这三个参数你见过吗?

🐧引例1

在Linux中,当我们生成一个可执行程序后一般要使用./ + 文件名的方式运行(./为文件的路径)。我们应该知道例如ls、pwd、touch等这些指令其实都是一个个可执行程序,那么为什么ls在执行的时候不需要用到./呢?

还有ls在执行的时候还可以添加一些参数呢?例如:ls -als -l等。那么我们自己生成的程序能否做到呢?

🐧引例2

在你的印象中,C语言中的main函数有参数吗?有几个参数呢?你是否见过这样的场景:

#include<stdio.h>

int main(int argc,char* argv[],char* envp[])
{
  printf("myprocess\n");
  return 0;
}

如果你见过,那么你清楚这些参数该怎么使用吗?

🐦认识环境变量

🔔环境变量的概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数;

🔔常见的环境变量

常见的环境变量有这些(我们可以使用$+环境变量名来查看环境变量的值):

  • PATH:指定命令的搜索路径;

学习C这么久了,main函数的这三个参数你见过吗?

假若我们也想将自己的程序像ls那样不指定路径就可以执行该怎么做呢?使用命令:

$ export PATH=$PATH:文件名

学习C这么久了,main函数的这三个参数你见过吗?

如上图所示,当我们把可执行程序的路径添加到环境变量PATH中以后,就可以直接使用文件名来执行程序了。

第二种方法

除了上面那种方法我们还可以将可执行程序拷贝到指定目录下(记得要以root的身份):

$ cp -rf 文件名 /usr/bin

学习C这么久了,main函数的这三个参数你见过吗?

除了PATH以外,还有其它环境变量例如: HOMEPWD等等。

学习C这么久了,main函数的这三个参数你见过吗?

或者使用指令 env 查看所有的环境变量:

学习C这么久了,main函数的这三个参数你见过吗?

🔔和环境变量相关的指令

  • echo: 显示某个环境变量值;
  • export: 设置一个新的环境变量;
  • env: 显示所有环境变量;
  • unset: 清除环境变量;
  • set: 显示本地定义的shell变量和环境变量;

🐦main函数的第三个参数

引例中提到了main函数是有参数的,我们首先来看看main函数的第三个参数——envpenvenvironment(环境)的缩写,猜一下它应该和环境变量有些关系。

首先我们可以观察到envp是一个指针数组的类型,它其实是一个表结构,这张表中的内容就是一个个的环境变量。

学习C这么久了,main函数的这三个参数你见过吗?
环境变量表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境变量字符串。且该表的结尾必须为NULL

🔔如何通过代码获取环境变量

🦋方法一 使用参数获取

第一种方式,我们可以遍历main函数提供的这张环境变量表。代码如下:

#include<stdio.h>

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

学习C这么久了,main函数的这三个参数你见过吗?

🦋方法二 使用全局变量获取

除了参数,库还为我们提供了一个全局变量environ。该变量是char**类型,其实就如同envp一样,使用方法也相同。

  • libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。
#include<stdio.h>

int main(int argc,char* argv[],char* envp[])
{
  extern char** environ;

  for(int i = 0; environ[i]; ++i)
  {
    printf("environ[%d] = %s\n",i,environ[i]);
  }
 // for(int i = 0; envp[i]; ++i)
 // {
 //   printf("envp[%d] = %s\n",i,envp[i]);
 // }
  return 0;
}

学习C这么久了,main函数的这三个参数你见过吗?

🦋方法三 使用系统调用获取(最实用)

我们还可以使用系统调用getenv来获取指定的环境变量,这种方法也是最实用的方法。

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

int main(int argc,char* argv[],char* envp[])
{
  char* path = getenv("PATH");
  if(path == NULL)
    perror("getenv");
  else 
    printf("%s\n",path);
    
  return 0;
}

学习C这么久了,main函数的这三个参数你见过吗?

🔔环境变量的全局属性

  • 环境变量通常具有全局属性,可以被子进程继承下去;
🦋证明

当一个程序变成进程,他的父进程就是bash。那么我们如果将某个环境变量添加到bash的环境变量表里面,该进程能够使用吗?结果如下:

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

int main(int argc,char* argv[],char* envp[])
{
  char* myenv = getenv("HELLO");
  if(myenv == NULL)
    perror("getenv");
  else 
    printf("%s\n",myenv);

  return 0;
}

学习C这么久了,main函数的这三个参数你见过吗?

🐦命令行参数

认识了main函数中的一个参数。其它两个也就非常容易理解了。在引例中我们提到,为什么ls在执行时可以使用-a、-l等选项,我们平时写的程序怎么不需要呢?

其实main函数为我们提供了这个功能,我们只是平时不太用而已。

🦋Demo

写一个程序测试一下我们能否使用命令行参数:

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

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

学习C这么久了,main函数的这三个参数你见过吗?

🔔有什么用?

我们看到了命令行参数的使用,那么我们平时该怎么使用呢?

我们可以使程序根据不同的命令行参数执行不同的内容从而达到一个程序多种使用的效果。例如:

  • 设计一个计算器,要求可以根据不同的选项完成不同的计算;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void Usage(const char* name)
{
  printf("\nUsage:%s -[+][-][*][/]\n\n",name);
  exit(-1);
}
int main(int argc,char* argv[],char* envp[])
{
  if(argc!=2) // 必须指定输入一个参数
    Usage(argv[0]);

  int n1 = 0;
  int n2 = 0;
  int ret = 0;
  printf("-----num1 = ");
  scanf("%d",&n1);
  printf("-----num2 = ");
  scanf("%d",&n2);
  if(strcmp(argv[1],"-+")==0) 
    ret = n1 + n2;
  else if(strcmp(argv[1],"--")==0) 
    ret = n1 - n2;
  else if(strcmp(argv[1],"-*")==0) 
    ret = n1 * n2;
  else if(strcmp(argv[1],"-/")==0) 
    ret = n1 / n2;
  printf("\n-----resault = %d\n",ret);
  return 0;
}

学习C这么久了,main函数的这三个参数你见过吗?

本章的内容就到这里了,觉得对你有帮助的话就支持一下博主把~

学习C这么久了,main函数的这三个参数你见过吗?

点击下方个人名片,交流会更方便哦~
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓文章来源地址https://www.toymoban.com/news/detail-450793.html

到了这里,关于学习C这么久了,main函数的这三个参数你见过吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言学习之main函数两个参数的应用

    main函数的两个参数: 参数argc: 表示在执行程序时,在终端所输入参数的个数, 包括可执行文件的名称 ; 参数argv: 1.本质上是一个 字符型指针数组 ; 2.用于获取指针数组中每个成员所指向的字符串; 3.存储时,参数argv指向所传递的 字符串的首地址 ; 伪代码表示: 测试代

    2024年02月11日
    浏览(55)
  • shell脚本中main函数中$#获取不到脚本传入参数个数浅析

    Linux的shell脚本,有时候我们在运行shell脚本时会给脚本传入参数,出于逻辑上的严谨,在脚本中可能会做一些逻辑判断或处理,例如判断脚本传入参数的个数。一般我们会用$#获取传入参数的个数,假如,我们在shell脚本的main函数中去判断脚本传入参数的个数,类似如下所示

    2024年03月14日
    浏览(98)
  • 【C++技能树】原来比C方便这么多 --缺省参数、函数重载、引用讲解

      Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接       我会一直往里填充内容哒! 🌈LeetCode专栏:专栏链接       目前在刷初级算法的LeetBook 。若每日一题当中有力所能

    2024年02月03日
    浏览(62)
  • [Linux 进程(三)] 进程优先级,进程间切换,main函数参数,环境变量

    排队的本质就是确认优先级。 优先级是什么?它也是PCB中的一个整型字段 , 数值越小,优先级越高 。是得到某种资源的先后顺序。 Linux进程的优先级数值范围:60~99。 Linux中默认进程的优先级都是80。 为什么要有优先级 ?本质是资源不足。 谈到优先级,就不得不说我们以

    2024年01月21日
    浏览(47)
  • python main 函数-启动-传递参数 python 打包 exe C# 进程传参

    在Python编程中,我们经常需要从命令行或其他外部环境中获取参数。Python提供了一种简单而灵活的方式来处理这些参数,即通过main函数传参 1.python main 函数-启动-传递参数 test.py 2. 如果直接传参给 脚本 输出:  输入 aa bb cc cc pyinstaller是一个流行的Python打包工具,它可以将P

    2024年02月09日
    浏览(41)
  • 工作这么久了,还不懂如何使用纯前端实现分页吗?-假如后端一股脑返回给你所有数据,让你自个实现分页该怎么办

    有这么个场景,后端接口的列表数据没有做分页给我,相当于是直接返回所有的列表数据,比如有100条就返回100,但是前端显示,则需要做成分页,比如10条为一页。 假如你用vue来实现,思路就是将数据切割,然后分批显示。 所以可以使用 computed 计算属性和 v-for 指令来实现

    2024年04月17日
    浏览(65)
  • 【编写LED驱动,创建三个设备文件,每一个设备文件和一个LED灯绑定,当操作这个设备文件时只能控制对应的这盏灯】

    编写LED驱动,创建三个设备文件,每一个设备文件和一个LED灯绑定,当操作这个设备文件时只能控制对应的这盏灯。 1.将GPIO的相关寄存器封装成结构体 -------- head.h 2.LED相关驱动文件 -------- led.c led0 ------ LED1 led1 ------ LED2 led2 ------ LED3 3.应用层测试文件 -------- test.c 实验结果

    2024年02月12日
    浏览(47)
  • 【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

    在使用GCC编译器进行程序开发时,我们经常会遇到一些编译过程中的问题, 比如为什么要加上\\\"-c\\\"选项,以及为什么生成的可执行文件无法执行等问题。 本篇博客将详细介绍这些问题,并给出相应的代码和解释,帮助读者更好地理解GCC编译过程中的\\\"-c\\\"选项和main函数的参数a

    2024年02月12日
    浏览(69)
  • Init函数和main函数

    go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。 有下面的特征: 两个函数的执行顺序: 对同一个go文件的init()调用顺序是从上到下的。 对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。 对于不同的packa

    2024年02月09日
    浏览(33)
  • 聊一聊springboot项目配置参数的三个来源

    大家好,我是G探险者,今天我们聊一聊,springboot的参数的三个来源。 平时我们部署项目后,难免都会进行一下配置修改,有的是在修改环境变量,有的是直接通过命令行参数进行修改,有的是直接改,配置文件,那么这三种不同来源的参数修改,都是如何生效的,以及他们

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包