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个呢?
xjh@ubuntu:~/iot/tmp$ cat shell.sh
#!/bin/bashecho "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脚本里的参数个数不包括可执行程序,$0表示可执行程序,$1表示第一个参数。
补充说明
main函数的原型还可以是:int main(int argc, char **argv, char **env)
其中第三个参数是一个字符串数组,表示环境变量。
#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;
}
输出结果
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
//省略