9.4 帶參數(shù)的主函數(shù)
C語(yǔ)言規(guī)定,主函數(shù)也可以帶參數(shù),就像我們編寫(xiě)的用戶函數(shù)一樣,可以帶參數(shù),也可以不帶參數(shù)。主函數(shù)的形式參數(shù)只有兩個(gè):一個(gè)形式參數(shù)是記錄了參數(shù)的個(gè)數(shù),這是一個(gè)整型的形式參數(shù),其名稱規(guī)定為“argc”;第二個(gè)形式參數(shù)依次記錄了在調(diào)用該主函數(shù)(即執(zhí)行程序)時(shí)給出的實(shí)際參數(shù)內(nèi)容(字符串),這個(gè)形式參數(shù)是一個(gè)字符指針型數(shù)組,每個(gè)元素指向一個(gè)實(shí)際參數(shù)對(duì)應(yīng)的字符串,第二個(gè)形式參數(shù)名稱規(guī)定為“argv[]”。
帶參數(shù)的主函數(shù)在定義時(shí),其函數(shù)頭的定義規(guī)定如下:
main(argc,argv)
int argc; /*第1個(gè)形式參數(shù):整型*/
char *argv[]; /*第2個(gè)形式參數(shù):字符指針型數(shù)組*/
如果主函數(shù)不帶參數(shù),執(zhí)行目標(biāo)程序時(shí)只要按下列格式輸入程序名就可以了:
程序名↙ (其中的↙表示回車(chē),下同)
我們通常把在操作系統(tǒng)下按上述格式執(zhí)行目標(biāo)程序時(shí),輸入的一行稱為“命令行”。
若主函數(shù)帶參數(shù),則執(zhí)行目標(biāo)程序時(shí),應(yīng)按下列格式給出相應(yīng)的實(shí)際參數(shù):
程序名 實(shí)際參數(shù)1 實(shí)際參數(shù)2 … 實(shí)際參數(shù)n↙
上述格式也是一個(gè)命令行。
此時(shí),系統(tǒng)會(huì)自動(dòng)在內(nèi)存開(kāi)辟區(qū)域依次存放程序名和所有的實(shí)際參數(shù),同時(shí)給主函數(shù)的形式參數(shù)賦值,結(jié)果如下:
形參argc 賦值為n+1,表示連同程序名在內(nèi)共有n+1個(gè)參數(shù)。
形參argv[0]賦值為存放“程序名”字符串的首地址;
argv[1]賦值為存放“實(shí)際參數(shù)1”字符串的首地址;
.
.
.
argv[n]賦值為存放“實(shí)際參數(shù)n”字符串的首地址。
例如,有一個(gè)名為“my_copy.c”的程序,其主函數(shù)帶有參數(shù)。如果在執(zhí)行時(shí),輸入的命令行如下:my_copy a:\ccw1.txt b:\ccw2.txt↙
則形式參數(shù)的值如下:
argc=3
argv[0]指向字符串 "my_copy"
argv[1]指向字符串 "a:\ccw1.txt"
argv[2]指向字符串 "a:\ccw2.txt"
在程序中可以通過(guò)形式參數(shù)獲得相應(yīng)的實(shí)際參數(shù),參與程序的運(yùn)算和加工。
【例9-8】編一個(gè)帶參數(shù)的主函數(shù)。運(yùn)行時(shí),在程序名后帶有2個(gè)整數(shù),程序的功能是輸出這2個(gè)整數(shù)的和。
程序清單如下:
#include "stdlib.h" /*程序中用到數(shù)據(jù)轉(zhuǎn)換類(lèi)函數(shù)*/
main(argc,argv)
int argc;
char *argv[];
{ int x,y,sum;
x=atoi(argv[1]); /*將第1個(gè)實(shí)際參數(shù)對(duì)應(yīng)的字符串轉(zhuǎn)換成整數(shù)存入x*/
y=atoi(argv[2]); /*將第2個(gè)實(shí)際參數(shù)對(duì)應(yīng)的字符串轉(zhuǎn)換成整數(shù)存入y*/
sum=x+y;
printf("%d+%d=%d\n",x,y,sum);
}
假定本程序編譯后的目標(biāo)程序名為"test1.exe",執(zhí)行該程序時(shí)輸入的命令行如下:
test1 5 10↙
則程序運(yùn)行后的輸出結(jié)果為:5+10=15。
【例9-9】編一個(gè)程序,完成磁盤(pán)文件復(fù)制。源文件名和目標(biāo)文件名隨程序運(yùn)行時(shí)輸入。例如,復(fù)制a盤(pán)根目錄下的文件ccw1.txt為a盤(pán)根目錄下的ccw2.txt,則執(zhí)行程序時(shí)輸入的命令行如下:程序名 a:\ccw1.txt a:\ccw2.txt↙。
程序清單如下:
#include "stdio.h" /*程序中用到文件處理類(lèi)函數(shù)*/
main(int argc,char *argv[])
{ FILE *fp1,*fp2;
if ((fp1=fopen(argv[1],"rb"))==NULL)
{ printf(“"file can not open!\n");
exit(0);
} /*以只讀方式打開(kāi)argv[1]指向的源文件名對(duì)應(yīng)的二進(jìn)制文件*/
if ((fp2=fopen(argv[2],"wb"))==NULL)
{ printf("file can not open!\n");
exit(0);
} /*以只寫(xiě)方式打開(kāi)argv[2]指向的目標(biāo)文件名對(duì)應(yīng)的二進(jìn)制文件*/
while(!feof(fp1)) /*復(fù)制源文件到目標(biāo)文件*/
fputc(fgetc(fp1),fp2);
fclose(fp1); /*關(guān)閉fp1所指向的源文件*/
fclose(fp2); /*關(guān)閉fp2所指向的目標(biāo)文件*/
}