当前位置:   article > 正文

int main(int argc,char* argv[])详解_int main(int argc, char *argv[])

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

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]);
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

然后用“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$ 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

从结果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:$#"
#注意,$#表示传给脚本的参数个数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

执行该脚本的时候,结果如下:

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

猜想

(1)$#尽管表示参数的个数,但可能它表示的是实际传参的个数,不包括可执行程序?(待求证)
(2)现在先这样记住
main函数的argc表示参数个数,包括可执行程序;
shell脚本里的参数个数不包括shell脚本程序,$0表示shell脚本程序,$1表示第一个参数。
  • 1
  • 2
  • 3
  • 4

补充说明
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

输出结果

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
//省略
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号