1. 程式人生 > >【C語言】main函式的引數解析

【C語言】main函式的引數解析

main函式

每個C程式都必須有一個main函式,main函式又稱為主函式,是執行程式的起點,它被稱之為函式,是否會像平時使用函式時需要自己的引數呢?
答案是肯定的,那麼他都有那些引數呢?

main函式的在vs2017環境下除錯,可以看到main函式裡的三個引數

#include <stdio.h>
int main()
{
	return 0;
}


可以看到,main函式裡面有三個引數

_argc
_argv
_get_initial_narrow_environment(維護環境變數)

main函式在被呼叫的時候,這三個引數也傳向main,只是沒有被main函式接到,也沒用。那麼在呼叫main函式時,在main函式裡面寫相對應的引數,main函式就可以接到這些值。

引數詳解

為了詳細瞭解main函式的引數,寫出以下程式碼:

#include <stdio.h>
int main(int _argc,char *_argv[],char *_get_initial_narrow_environment[])
{
	int i = 0;
	for (i = 0; i < _argc; i++)
	{
		printf("%s\n",_argv[i]);
	}
	return 0;
}

程式輸出如下圖所示:

這是可執行程式的名字。
滑鼠右擊工程的名字main->屬性->配置屬性->除錯->命令列引數,修改命令列引數並且應用如下:


再來執行程式,輸出如下圖所示:

注意到工程的命令列引數可以通過**_argv這個陣列獲取到,命令列引數的個數可以由_argc**獲取到。

注:_argv陣列的最後一個元素存放了一個NULL的指標。
程式碼改了如下:

int main(int _argc, char *_argv[], char *_get_initial_narrow_environment[])
{
	int i = 0;
	while (_argv[i] != NULL)
	{
		printf("%s\n", _argv[i]);
			i++;
	}
	return 0;
}

輸出結果如下:

驗證得出_argv陣列的最後一個元素存放了一個NULL的指標。

瞭解了前面連個引數,最後一個引數是什麼呢?
寫出一下程式碼:

int main(int _argc, char *_argv[], char *_get_initial_narrow_environment[])
{
	int i = 0;
	while (_get_initial_narrow_environment[i] != NULL)
	{
		printf("%s\n", _get_initial_narrow_environment[i]);
			i++;
	}
	return 0;
}

輸出結果如下:

結果顯示都是環境變數(內容太多,擷取部分)。
注:_get_initial_narrow_environment陣列的最後一個元素存放了一個NULL的指標。

1. _argc

_argc是個整型變數,表示命令列引數的個數(含第一個引數)。

2._argv

_argv是個字元指標的陣列,每個原元素都是一個字元指標,指向一個字串。這些字串就是命令列中的每一個引數(字串)。

3._get_initial_narrow_environment

_get_initial_narrow_environment是字元指標的陣列,陣列的每一個原元素是一個指向一個環境變數(字串)的字元指標。
####4.舉個例子

#include <stdio.h>
#include <stdlib.h>
int  Add(int a, int b)
{
	return a + b;
}
int  Sub(int a, int b)
{
	return a - b;
}
int  Mul(int a, int b)
{
	return a * b;
}
int  Div(int a, int b)
{
	return a / b;
}

int main(int _argc,char *_argv[],char *_get_initial_narrow_environment[])
{
	int ret = 0;
	if (_argc != 4)
	{
		printf("引數有誤\n");
	}
	switch (*(_argv[1] + 1))
	{
	case 'a':
		ret = Add(atoi(_argv[2]), atoi(_argv[3]));
		break;
	case 's':
		ret = Sub(atoi(_argv[2]), atoi(_argv[3]));
		break;
	case 'm':
		ret = Mul(atoi(_argv[2]), atoi(_argv[3]));
		break;
	case 'd':
		ret = Div(atoi(_argv[2]), atoi(_argv[3]));
		break;
	default:
		printf("引數有誤:%s", _argv[1]);
		break;
	}
	printf("ret=%d\n", ret);
	return 0;
}

命令列引數改為:

執行結果:

總結

_argc,_argv描述命令列引數息,_get_initial_narrow_environment描述環境變數

如有不足之處,歡迎指正!!