
各位读者大佬好,我是落羽!一个坚持不断学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页: 落羽的落羽
学了C语言和C++,来思考一个问题: main函数能不能带参数?

看起来可以,而且源文件编译后也能正常执行,那么main函数带参数有什么意义呢?
C/C++中,main函数的参数,称为命令行参数 C标准对带参main的规定是:
int(表示命令行参数个数),通常设为int argcchar* [](字符指针数组),通常设为char* argv[]argv是一个字符串数组,它有argc个元素。
argv[0]元素是这个程序名,argv[argc]是NULL。数组的元素,是在命令行执行程序时读取的子串!
命令行参数,可以用来实现一个程序读取不同选项而实现不同的子功能!
证明一下:
#include<stdio.h>
int main(int argc, char* argv[])
{
printf("argc:%d\n", argc);
int i = 0;
for(; i < argc; i++)
{
printf("argv[%d]: %s\n", i, argv[i]);
}
return 0;
}
举个栗子,执行ls命令时,使用ls -a选项,能达到特殊的效果。此时在命令执行内部,argc是2(因为命令行有两个子串ls、-a),argc[0]是"ls",argc[1]是"-a"。程序内部就可以用strcmp等方法判断argc[1]内容,进而能执行不同子程序!
有了这个方法,我们也能在自己的程序中实现带选项的功能了,举例:
#include<stdio.h>
#include<string.h>
int main(int argc, char* argv[])
{
if(argc < 2)
{
//说明此时命令行中没有写选项
printf("执行没有选项的功能\n");
}
else if(argc == 2)
{
if(strcmp(argv[1],"-a") == 0)
{
printf("执行选项-a功能\n");
}
else if(strcmp(argv[1], "-b") == 0)
{
printf("执行选项-b功能\n");
}
else if(strcmp(argv[1], "-c") == 0)
{
printf("执行选项-c功能\n");
}
else
{
printf("没有此选项\n");
}
}
return 0;
}
没有问题
环境变量,一般是指在操作系统中用于指定操作系统运行环境的一些参数。比如,我们在写C程序时,链接时自己并没有指定动静态库在哪里,但是就能自动链接成功,就是因为有相关的环境变量帮助编译器查找。 环境变量是系统级的变量,包括变量名和变量内容,往往有全局属性!
命令env,可以查看当前系统中所有的环境变量:

而命令echo $xxx,可以查看一个具体的环境变量的内容
环境变量PATH:用于指定命令的搜索路径。
思考一下,既然命令本质也是可执行程序,比如ls,它的位置是/usr/bin/ls。为什么执行系统命令时可以不带路径直接输入ls,但是执行一个自己写的程序就必须带路径,如./test
这就是PATH的作用,当你输入一个命令而不指定目录时,系统会遍历 PATH 中配置的目录,查找与命令名匹配的可执行文件,找到后立即执行;若遍历完所有目录都没找到,就会报错!
回头来看,我们也可以指定系统命令的目录让系统查找:

通过echo $PATH命令,查看PATH中的内容:

原来,PATH中有很多目录,其中包括/usr/bin,这就是为什么直接执行ls,系统能通过遍历PATH中的目录,找到usr/bin,找到usr/bin/ls!
所以,只要我们将自己写的程序所在路径写入到PATH中,就可以不用指定程序目录而能直接执行了。修改PATH的方法是:
PATH=路径(不能带空格):修改PATH的内容,会覆盖以前的内容(不必担心,重新登录系统会恢复)PATH=$PATH:路径(不能带空格):向PATH中新增一个路径,不会覆盖以前的内容

环境变量HOME:用于指定当前用户的工作目录,即用户登录系统时所处的默认目录

环境变量SHELL:是当前系统的shell,通常是/bin/bash

环境变量PWD记录着当前所处目录,OLDPWD则记录最近一次所处的目录:
它们对应着命令pwd和cd -的原理

和环境变量相关的命令:
echo $xxx:显示某个具体环境变量的内容env:显示所有环境变量export xxx:设置一个新的环境变量unset xxx:清除一个环境变量set:显示所有本地定义的shell变量和环境变量其中,export、unset是内存级的,他们修改环境变量后重启系统就会恢复。实际上,在每次启动系统时,系统会在~/.bash_profile等文件中重新配置环境变量,只要这些文件中的内容不变,环境变量在每次启动程序配置后都是一样的。
换句话说,假如我修改了~/.bash_profile内容,在每次启动系统时应该也会受影响:
比如,我在这个文件中新加一条命令:

果然,启动系统时这一句也被执行了:

环境变量,其实都被组织到了一张环境变量表中,这是一个字符指针数组,每个元素指向一个环境变量名=内容的字符串。而我们在程序中也能获取到这张表,进而能获取到环境变量,有几个方法:
char* env[],就是环境变量表:

打印结果:

environ,在头文件<unistd.h>中,他也记录了环境变量表,使用时在部分编译器中还需声明extern char** environ; :
执行结果也是一样的:

getenv能获取某个具体环境变量内容,他在头文件<stdlib.h>中,给他传参具体的一个环境变量名,他返回这个环境变量的内容字符串:

结果没问题:

环境变量,通常具有全局属性!可以被子进程继承下去。
命令行参数、环境变量,也是数据,默认是在bash内部,内存中的。bash启动的子进程,也能看到父进程bash的代码和数据。而bash进程的环境变量,是从Linux系统的配置文件中获取的,如~/.bashrc文件。
刚才提到,export可以设置一个环境变量,如export XXX="abc"。如果只写XXX="abc",这种称之为本地变量,这种变量无法被子进程继承,不具有全局属性,只能在bash内访问。
本篇完,感谢阅读