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” 时,程序中某些指令才会正常执行。