C/C++ 中 main(int argc, char* argv[], char** env) 函数的参数及应用

C/C++ 中 main(int argc, char* argv[], char** env) 函数的参数及应用

main 中参数介绍

通常在我们使用 main( ) 函数时,格式如下:

int main(){
    ...
    return 0;
}

main( ) 函数中括号内是不需要传递参数的,然而有些时候我们却会碰到带了多个参数的main:

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

这些参数究竟是什么意思呢?

第一个参数int argv代表命令行参数个数,argv值至少为1,更确切地说是代表第二个参数char* argv[]中元素的个数。从类型上说,argv[]是指针数组,数组中的元素是指针,指针指向字符串参数;从作用而言,argv[]是命令行输入的参数列表,记录了程序员在命令行中输入的所有参数,其中第1个参数是所写程序对应的可执行文件 (.exe) 的完整文件路径,其后的参数为用户在命令行中输入的其他字符串。

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

若在CodeBlocks中直接运行 main.cpp,则仅输出一个默认参数 argv[0],也就是程序对应的可执行文件 (.exe) 的文件路径。
在这里插入图片描述

有兴趣的同学可以 win + R ,输入 cmd ,进入命令行窗口,将文件路径输入,空格,再随意输入一些其他字符 ( 如下图 ),最后回车,看看输出结果是什么。

在这里插入图片描述

第三个参数char **env指向了当前的环境变量,例如可用以下代码查看本机的环境变量

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

部分环境变量结果如下
在这里插入图片描述

main 函数参数的应用案例

我们可以看到 env[39] 中环境变量为 “ USERNAME=XXX ” ,含义为当前的用户名为 XXX 。既然我们能够从环境变量中提取到当前用户名信息,那么我们可以设计一个函数使得只有当前用户名是指定用户名 ( 如:YeJY ) 时,才能执行某一操作 ( 如:printf("Right! Execute the program\n") ) ,否则退出程序,输出 “Error”,不执行任何操作。这样我们就实现了一个简单的权限控制。

int main(int argc, char*argv[], char**env)
{
    //for(int i = 0; i < argc; i++) printf("argv[%d]: %s\n", i, argv[i]);
    for(int i = 0; env[i]; i++){
        printf("env[%d]: %s\n",i ,env[i]);
        string s = env[i];
        if(s.find("USERNAME=") == 0){
            string c = s.substr(9, s.size());	//“USERNAME=” 长度为 9,“=” 后下个字符下标为 9;
            if(c == "YeJY") printf("Right! Execute the program\n");
            else {
                printf("Error\n");
                exit(1);
            }
        }
    }
    printf("Finished!\n"); 
    return 0;
}

程序执行结果如下
在这里插入图片描述
如此一来,当且仅当用户名为 “YeJY” 时,程序中某些指令才会正常执行。

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值