C语言-主函数参数

C/C++程序中必须有一个main()函数,称为程序的主函数是程序的入口。main()函数参数不是必须的,其参数可以用于接收程序运行所需的外部参数。通常会定义两个参数argc和argv,分别用于传递参加数量和参数字符串数组。

C/C++程序中必须有一个main()函数,称为程序的主函数是程序的入口。main()函数参数不是必须的,其参数可以用于接收程序运行所需的外部参数。通常会定义两个参数argc和argv,分别用于传递参加数量和参数字符串数组。

在C语言标准中给出了main()函数的两种形式,第一种没有参数,程序执行时不能输入参数;第二种有参数,可以在程序执行时输入参数:

// 无参数
int main(void) { /* ... */ } 
// 有参数
int main(int argc, char *argv[]) { /* ... */ }

形参argc是argument counter的缩写,指程序传入参数的个数;argv是argument vector的缩写,是一个指针数组用于传递程序的输入参数。 下面一个示例会输出参数的个数,以及每个参数:

#include <stdio.h>
int main(int argc, char *argv[]){
    printf("Number of args:%d\n",argc);
    for (int i=0; i < argc; i++){
        printf("argv[%d] is: %s\n",i,argv[i]);
    }
    return 0;
}

编译上面的代码,执行程序:

# 不指定参数
$ ./a.out
Number of args:1
argv[0] is: ./a.out
# 指定两个参数
$./a.out a b
Number of args:3
argv[0] is: ./a.out
argv[1] is: a
argv[2] is: b

由上面的测试可以看出,argc所表示的参数数量是包含程序本身的,及argv[0]存储程序的执行命令(./a.out),后面依次是程序输入参数,因此argc的值为输入的参数数量加1。

int main(int argc,char *argv[]){
	int num_arg = argc;
	// printf("Number of args = %d\n",num_arg);
	int num_n=0,num_p=0;
	for (int i=1; i<num_arg; i++){
		char *tmp = argv[i];
		if (tmp[0] == '-'){
			num_n++;
		} else {
			num_p++;
		}
	}
	printf("%d,%d\n",num_p,num_n);
	return 0;
}

形参argv可以理解为是一个字符串数组,使用参数时需要从这个数组中提取每个字符串并根据需要做转换。如下面的示例计算输入参数的平均值,由于输入参数以字符串的形式存储,需要使用atof()转换为浮点数:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
    if ( argc > 1)
    {
        double sum = 0,avg;
        for (int i = 1; i < argc; i++)
        {
            sum += atof(argv[i]);
        }
        avg = sum / (argc-1);
        printf("Sum is:%f\n",avg);
    } else
    {
        printf("Please give some numbers.\n");
    }
    return 0;
}

以上就是关于主函数参数的简单介绍及使用方法,在ANSI-C的标准中只给出了前面的两种形式,不过在一些平台上还可以使用在main()函数中使用第三个形参来获取环境变量:

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

这里的envpargv类似也是指针数组,以字符串数组的形成存储各个系统环境变量,当然也可以使用stdlib中的getenv()函数来或者指定环境变量。本文就不作讨论了。


参考

  1. C 命令行参数-菜鸟教程