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
    评论
// >>> common include #include <iostream> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> // >>> verilator #include <memory> #include <verilated.h> #include <verilated_vcd_c.h> #include "VA_top.h" #include "sdm_config.h" #include "Sdm_node_A.h" using HW =VA_top; uint64_t GlobalMainTime = 0; int main(int argc, char** argv, char**env) { const std::unique_ptr<VerilatedContext> contextp{new VerilatedContext}; const std::unique_ptr<HW> hw {new HW{contextp.get(), "TOP"}}; Sdm_config * shuncfg_ptr = new Sdm_config (sub_node_A_node_name); shuncfg_ptr->arg_parse (argc, argv); Sdm_node_A shunobj (shuncfg_ptr, hw.get(), contextp.get()); Verilated::mkdir("node_node_A_logs"); contextp->debug(0); contextp->randReset(2); contextp->commandArgs(argc, argv); #if VM_TRACE == 1 VerilatedVcdC* tgp = NULL; const char* flag = Verilated::commandArgsPlusMatch("trace"); if (flag && 0 ==strcmp(flag, "+trace")) { Info("Enter Trace!"); contextp->traceEverOn(true); tfp = new VerilatedVcdC; hw->trace(tfp,99); shunobj.fulleval(); std::string filename = shuncfg_ptr->dumpfile(); tfp->open(filename.c_str()); }; #endif shunobj.setup(); bool retmp; int loop = 0; while(1) { //Info("loop %d", loop); shunobj.update(); if (shunobj.finish()) break; do { shunobj.eval(); shunobj.sync(); } while(!shunobj.converge()); #if VM_TRACE == 1 if (flag && 0 == strcmp(flag, "+trace")) { tfp->dump(contextp->time()); } #endif loop++; } hw->final(); return 0; #if VM_TRACE == 1 if (flag && 0 == strcmp(flag, "+trace")){ tfp->close(); } #endif #if VM_COVERAGE Verilated::mkdir("node_node_A_logs"); contextp->coverageep()->write("node_node_A_logs/coverage.dat"); #endif }
07-04

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值