【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描述環境變數
如有不足之處,歡迎指正!!