int main(int argc,char* argv[]) 也可以写成 int main(int argc,char** argv)。
argc表示程序运行时发送给main函数的命令行参数的个数(包括可执行程序以及传参)。
argv[]是字符指针数组,它的每个元素都是字符指针,指向命令行中每个参数的第一个字符。
- argv[0]指向可执行程序。
- argv[1]指向可执行程序后的第一个字符串。
- argv[2]指向可执行程序后的第二个字符串 。
- argv[3]指向可执行程序后的第三个字符串 。
- argv[argc]为NULL。
比如在Linu系统下使用vim编写以下代码,并保存为sample.c。
#include <stdio.h>
int main(int argc,char** argv)
{
int i;
printf("%d\n",argc);
for(i=0;i<argc;i++)
{
printf("%s\n",*argv);
argv++;
//printf("%s\n",argv[i]);
}
}
然后用“gcc sample.c -o sample.out”编译得到sample.out后,输入“./sample.out aa bb cc”执行。
xjh@ubuntu:~/iot/tmp$ gcc sample.c -o sample.out
xjh@ubuntu:~/iot/tmp$ ls
sample.c sample.out
xjh@ubuntu:~/iot/tmp$ ./sample.out aa bb cc
4 //显示有4个参数,显然把可执行程序也当做参数了
./sample.out
aa
bb
cc
xjh@ubuntu:~/iot/tmp$
从结果argc=4可知,可执行程序也属于参数之一。
既然可执行程序也属于参数之一,为何下面情况显示的参数个数不是5个呢?
比如有一个名为shell.sh的脚本,其内容如下:
#!/bin/bash
echo "shell_0:$0"
echo "shell_1:$1"
echo "shell_2:$2"
echo "shell_3:$3"
echo "shell_4:$4"
echo "arg_number:$#"
#注意,$#表示传给脚本的参数个数
执行该脚本的时候,结果如下:
xjh@ubuntu:~/iot/tmp$ ./shell.sh aa1 bb2 cc3 dd4
shell_0:./shell.sh //$0的值
shell_1:aa1 //$1的值
shell_2:bb2 //$2的值
shell_3:cc3 //$3的值
shell_4:dd4 //$4的值
arg_number:4 //$#表示参数的个数。上面说可执行程序也属于参数,那这里的参数个数为何不是5个?
xjh@ubuntu:~/iot/tmp$
猜想
(1)$#尽管表示参数的个数,但可能它表示的是实际传参的个数,不包括可执行程序?(待求证)
(2)现在先这样记住
main函数的argc表示参数个数,包括可执行程序;
shell脚本里的参数个数不包括shell脚本程序,$0表示shell脚本程序,$1表示第一个参数。
补充说明
main函数的原型还可以是:int main(int argc, char **argv, char **env)
其中第三个参数是一个字符串数组,表示环境变量。文章来源:https://www.toymoban.com/news/detail-467343.html
#include <stdio.h>
// env就是我们给main函数额外传递的环境变量字符串数组
int main(int argc, char **argv, char **env)
{
int i = 0;
printf("argc = %d.\n", argc);
while (NULL != argv[i])
{
printf("argv[%d] = %s\n", i, argv[i]);
i++;
}
i = 0;
while (NULL != env[i])
{
printf("env[%d] = %s\n", i, env[i]);
i++;
}
return 0;
}
输出结果文章来源地址https://www.toymoban.com/news/detail-467343.html
xjh@ubuntu:~/iot/tmp$ ./a.out
argc = 1.
argv[0] = ./a.out
env[0] = XDG_VTNR=7
env[1] = LC_PAPER=zh_SG.UTF-8
env[2] = LC_ADDRESS=zh_SG.UTF-8
env[3] = XDG_SESSION_ID=c2
env[4] = XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/xjh
env[5] = SELINUX_INIT=YES
//省略
到了这里,关于int main(int argc,char* argv[])详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!